jQuery والتعامل مع DOM
أحداث النماذج
العمل مع أحداث النماذج في jQuery
أحداث النماذج حاسمة لإنشاء تجارب إدخال مستخدم تفاعلية ومتحققة. تبسط jQuery التعامل مع النماذج بطرق أحداث قوية.
أحداث النماذج الشائعة
- submit: يُطلق عند إرسال نموذج
- focus: عندما يحصل حقل إدخال على التركيز
- blur: عندما يفقد حقل إدخال التركيز
- change: عندما تتغير قيمة الإدخال
- input: عندما يُدخل المستخدم بيانات (في الوقت الفعلي)
- select: عندما يتم تحديد نص في إدخال
حدث الإرسال
يُطلق حدث الإرسال عندما يرسل المستخدم نموذجاً. يُستخدم عادة للتحقق من صحة النموذج:
إرسال النموذج الأساسي:
<form id="loginForm">
<input type="text" id="username" placeholder="اسم المستخدم">
<input type="password" id="password" placeholder="كلمة المرور">
<button type="submit">تسجيل الدخول</button>
</form>
<script>
$("#loginForm").on("submit", function(event) {
event.preventDefault(); // منع الإرسال الافتراضي للنموذج
let username = $("#username").val();
let password = $("#password").val();
console.log("اسم المستخدم:", username);
console.log("كلمة المرور:", password);
// إجراء إرسال AJAX أو التحقق هنا
});
</script>
مهم: استخدم دائماً
event.preventDefault() في معالج الإرسال لمنع إعادة تحميل الصفحة، خاصة عند استخدام AJAX.
أحداث التركيز والضبابية
تساعد هذه الأحداث في إنشاء تجارب مستخدم أفضل مع تعليقات بصرية:
مثال على التركيز والضبابية:
<input type="text" id="email" placeholder="أدخل البريد الإلكتروني">
<span id="emailHelp" style="display:none;">
يرجى إدخال عنوان بريد إلكتروني صالح
</span>
<script>
$("#email").on("focus", function() {
$(this).css("border-color", "var(--primary)");
$("#emailHelp").fadeIn();
}).on("blur", function() {
$(this).css("border-color", "#ddd");
$("#emailHelp").fadeOut();
});
</script>
حدث التغيير
يُطلق حدث التغيير عندما تتغير القيمة ويفقد العنصر التركيز. رائع للقوائم المنسدلة ومربعات الاختيار:
تغيير القائمة المنسدلة:
<select id="country">
<option value="">اختر البلد</option>
<option value="us">الولايات المتحدة</option>
<option value="uk">المملكة المتحدة</option>
<option value="ca">كندا</option>
</select>
<div id="selectedCountry"></div>
<script>
$("#country").on("change", function() {
let selected = $(this).val();
let text = $(this).find("option:selected").text();
$("#selectedCountry").html("لقد اخترت: <strong>" + text + "</strong>");
});
</script>
تغيير مربع الاختيار:
<input type="checkbox" id="terms">
<label for="terms">أوافق على الشروط والأحكام</label>
<button id="submitBtn" disabled>إرسال</button>
<script>
$("#terms").on("change", function() {
if ($(this).is(":checked")) {
$("#submitBtn").prop("disabled", false);
} else {
$("#submitBtn").prop("disabled", true);
}
});
</script>
حدث الإدخال (الوقت الفعلي)
يُطلق حدث الإدخال فوراً عند تغيير القيمة، على عكس التغيير الذي ينتظر الضبابية:
عداد الأحرف في الوقت الفعلي:
<textarea id="message" maxlength="200"></textarea>
<div id="charCount">0/200 حرف</div>
<script>
$("#message").on("input", function() {
let length = $(this).val().length;
let maxLength = $(this).attr("maxlength");
$("#charCount").text(length + "/" + maxLength + " حرف");
// تغيير اللون عند الاقتراب من الحد
if (length > maxLength * 0.9) {
$("#charCount").css("color", "red");
} else {
$("#charCount").css("color", "var(--text-dark)");
}
});
</script>
مثال على التحقق من النموذج
نموذج تسجيل كامل مع التحقق:
<form id="registrationForm">
<div>
<input type="text" id="regUsername" placeholder="اسم المستخدم" required>
<span class="error" id="usernameError"></span>
</div>
<div>
<input type="email" id="regEmail" placeholder="البريد الإلكتروني" required>
<span class="error" id="emailError"></span>
</div>
<div>
<input type="password" id="regPassword" placeholder="كلمة المرور" required>
<span class="error" id="passwordError"></span>
</div>
<button type="submit">تسجيل</button>
</form>
<script>
$(document).ready(function() {
// التحقق من اسم المستخدم في الوقت الفعلي
$("#regUsername").on("input", function() {
let username = $(this).val();
if (username.length < 3) {
$("#usernameError").text("اسم المستخدم يجب أن يكون 3 أحرف على الأقل");
} else if (!/^[a-zA-Z0-9_]+$/.test(username)) {
$("#usernameError").text("يُسمح فقط بالحروف والأرقام والشرطة السفلية");
} else {
$("#usernameError").text("").css("color", "green").text("✓");
}
});
// التحقق من البريد الإلكتروني عند الضبابية
$("#regEmail").on("blur", function() {
let email = $(this).val();
let emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailPattern.test(email)) {
$("#emailError").text("يرجى إدخال عنوان بريد إلكتروني صالح");
} else {
$("#emailError").text("").css("color", "green").text("✓");
}
});
// مؤشر قوة كلمة المرور
$("#regPassword").on("input", function() {
let password = $(this).val();
let strength = 0;
if (password.length >= 8) strength++;
if (/[a-z]/.test(password)) strength++;
if (/[A-Z]/.test(password)) strength++;
if (/[0-9]/.test(password)) strength++;
if (/[^a-zA-Z0-9]/.test(password)) strength++;
let strengthText = ["ضعيفة جداً", "ضعيفة", "متوسطة", "جيدة", "قوية"];
let colors = ["#ff0000", "#ff6600", "#ffcc00", "#99cc00", "#00cc00"];
$("#passwordError")
.text("القوة: " + strengthText[strength - 1])
.css("color", colors[strength - 1]);
});
// إرسال النموذج
$("#registrationForm").on("submit", function(event) {
event.preventDefault();
// التحقق من مرور جميع التحققات
let isValid = true;
$(".error").each(function() {
if ($(this).text() !== "✓" && $(this).text() !== "") {
isValid = false;
}
});
if (isValid) {
alert("تم إرسال النموذج بنجاح!");
// إجراء إرسال AJAX هنا
} else {
alert("يرجى إصلاح جميع الأخطاء قبل الإرسال");
}
});
});
</script>
حدث التحديد
يُطلق عندما يتم تحديد نص في إدخال أو منطقة نص:
مثال تحديد النص:
<input type="text" id="selectText" value="حدد بعض النص في هذا الحقل">
<div id="selectedText"></div>
<script>
$("#selectText").on("select", function() {
let selected = $(this).val().substring(
this.selectionStart,
this.selectionEnd
);
$("#selectedText").text("المحدد: " + selected);
});
</script>
التعامل مع أزرار الاختيار
اختيار زر الاختيار:
<form>
<label>
<input type="radio" name="payment" value="credit"> بطاقة ائتمان
</label>
<label>
<input type="radio" name="payment" value="paypal"> PayPal
</label>
<label>
<input type="radio" name="payment" value="bank"> تحويل بنكي
</label>
</form>
<div id="paymentMethod"></div>
<script>
$('input[name="payment"]').on("change", function() {
let method = $(this).val();
$("#paymentMethod").text("طريقة الدفع: " + method);
});
</script>
خطأ شائع: استخدام
.val() مقابل .text() - استخدم .val() لإدخالات النماذج و .text() أو .html() لعناصر العرض.
مثال عملي: نموذج اتصال مع التحقق المباشر
نموذج اتصال كامل:
<form id="contactForm" class="form-container">
<h2>اتصل بنا</h2>
<div class="form-group">
<input type="text" id="name" placeholder="اسمك" required>
<span class="validation-msg" id="nameMsg"></span>
</div>
<div class="form-group">
<input type="email" id="contactEmail" placeholder="البريد الإلكتروني" required>
<span class="validation-msg" id="emailMsg"></span>
</div>
<div class="form-group">
<select id="subject" required>
<option value="">اختر الموضوع</option>
<option value="general">استفسار عام</option>
<option value="support">دعم فني</option>
<option value="feedback">ملاحظات</option>
</select>
</div>
<div class="form-group">
<textarea id="contactMessage" rows="5" placeholder="رسالتك" required></textarea>
<span class="char-counter" id="charCounter">0/500</span>
</div>
<button type="submit" id="submitContact">إرسال الرسالة</button>
</form>
<script>
$(document).ready(function() {
// التحقق من الاسم
$("#name").on("blur", function() {
let name = $(this).val().trim();
if (name.length < 2) {
$("#nameMsg").text("الاسم قصير جداً").css("color", "red");
return false;
} else {
$("#nameMsg").text("✓").css("color", "green");
return true;
}
});
// التحقق من البريد الإلكتروني
$("#contactEmail").on("blur", function() {
let email = $(this).val();
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
$("#emailMsg").text("بريد إلكتروني غير صالح").css("color", "red");
return false;
} else {
$("#emailMsg").text("✓").css("color", "green");
return true;
}
});
// عداد الأحرف
$("#contactMessage").on("input", function() {
let length = $(this).val().length;
$("#charCounter").text(length + "/500");
if (length > 500) {
$(this).val($(this).val().substring(0, 500));
}
});
// إرسال النموذج
$("#contactForm").on("submit", function(event) {
event.preventDefault();
// التحقق من جميع الحقول
let valid = true;
if ($("#name").val().trim().length < 2) valid = false;
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($("#contactEmail").val())) valid = false;
if ($("#subject").val() === "") valid = false;
if ($("#contactMessage").val().trim().length < 10) valid = false;
if (valid) {
// تعطيل زر الإرسال
$("#submitContact").prop("disabled", true).text("جاري الإرسال...");
// محاكاة إرسال AJAX
setTimeout(function() {
alert("تم إرسال الرسالة بنجاح!");
$("#contactForm")[0].reset();
$("#submitContact").prop("disabled", false).text("إرسال الرسالة");
$(".validation-msg").text("");
}, 2000);
} else {
alert("يرجى ملء جميع الحقول بشكل صحيح");
}
});
});
</script>
تمرين تطبيقي:
المهمة: إنشاء نموذج استبيان بالميزات التالية:
- إدخال نص للاسم (3 أحرف على الأقل)
- إدخال بريد إلكتروني مع التحقق
- محدد نطاق العمر (قائمة منسدلة: 18-25، 26-35، 36-45، 46+)
- نظام تقييم باستخدام أزرار الاختيار (1-5 نجوم)
- منطقة نص للتعليقات بحد 300 حرف مع عداد
- زر إرسال يتحقق من جميع الحقول
- عرض ملخص لجميع المدخلات قبل الإرسال النهائي
مكافأة: أضف زر "مسح النموذج" يعيد تعيين جميع الحقول والتحققات.
النقاط الرئيسية
- استخدم
event.preventDefault()لمنع الإرسال الافتراضي للنموذج .val()يحصل على أو يضبط قيم إدخال النموذج- استخدم
blurللتحقق بعد مغادرة المستخدم للحقل - استخدم حدث
inputللتعليقات في الوقت الفعلي .is(":checked")يتحقق من حالة مربع الاختيار/زر الاختيار- تحقق دائماً على كل من جانب العميل والخادم