We are still cooking the magic in the way!
jQuery والتعامل مع DOM
jQuery مقابل JavaScript العادي
jQuery مقابل JavaScript العادي
فهم الاختلافات بين jQuery وJavaScript العادي الحديث يساعدك على اختيار الأداة المناسبة لمشروعك. في هذا الدرس، سنقارن المهام الشائعة ونرى كيف يعمل كلا النهجين.
ما هو Vanilla JavaScript؟
"Vanilla JavaScript" تعني ببساطة JavaScript النقي بدون أي مكتبات أو أطر عمل. لقد تطورت JavaScript الحديثة (ES6+) بشكل كبير وتتضمن الآن العديد من الميزات التي جعلت jQuery شائعة.
💡 نقطة مهمة: المتصفحات الحديثة تدعم طرق JavaScript الأصلية القوية التي يمكن أن تحل محل jQuery في كثير من الأحيان. ومع ذلك، jQuery لا تزال قيمة لـ:
- التطوير السريع والنماذج الأولية
- العمل مع قواعد الأكواد القديمة
- بناء جملة مبسط للمهام الشائعة
- التوافق عبر المتصفحات (المتصفحات القديمة)
اختيار العناصر
حسب المعرف
jQuery:
var element = $('#myId');
JavaScript العادي:
var element = document.getElementById('myId');
// أو الطريقة الحديثة:
var element = document.querySelector('#myId');
حسب الفئة
jQuery:
var elements = $('.myClass');
JavaScript العادي:
var elements = document.getElementsByClassName('myClass');
// أو الطريقة الحديثة:
var elements = document.querySelectorAll('.myClass');
حسب اسم الوسم
jQuery:
var paragraphs = $('p');
JavaScript العادي:
var paragraphs = document.getElementsByTagName('p');
// أو الطريقة الحديثة:
var paragraphs = document.querySelectorAll('p');
محددات معقدة
jQuery:
var items = $('#menu li.active');
JavaScript العادي:
var items = document.querySelectorAll('#menu li.active');
📝 ملاحظة:
querySelector() وquerySelectorAll() في JavaScript الحديثة تستخدم نفس بناء جملة محدد CSS مثل jQuery، مما يجعل الانتقال أسهل.
معالجة المحتوى
الحصول على/تعيين النص
jQuery:
// الحصول على النص
var text = $('#myDiv').text();
// تعيين النص
$('#myDiv').text('نص جديد');
JavaScript العادي:
var element = document.querySelector('#myDiv');
// الحصول على النص
var text = element.textContent;
// تعيين النص
element.textContent = 'نص جديد';
الحصول على/تعيين HTML
jQuery:
// الحصول على HTML
var html = $('#myDiv').html();
// تعيين HTML
$('#myDiv').html('<strong>نص عريض</strong>');
JavaScript العادي:
var element = document.querySelector('#myDiv');
// الحصول على HTML
var html = element.innerHTML;
// تعيين HTML
element.innerHTML = '<strong>نص عريض</strong>';
الحصول على/تعيين قيم الإدخال
jQuery:
// الحصول على القيمة
var value = $('#username').val();
// تعيين القيمة
$('#username').val('أحمد محمد');
JavaScript العادي:
var input = document.querySelector('#username');
// الحصول على القيمة
var value = input.value;
// تعيين القيمة
input.value = 'أحمد محمد';
تعديل CSS
خاصية واحدة
jQuery:
$('#myDiv').css('color', 'red');
JavaScript العادي:
document.querySelector('#myDiv').style.color = 'red';
خصائص متعددة
jQuery:
$('#myDiv').css({
color: 'red',
fontSize: '20px',
backgroundColor: 'yellow'
});
JavaScript العادي:
var element = document.querySelector('#myDiv');
element.style.color = 'red';
element.style.fontSize = '20px';
element.style.backgroundColor = 'yellow';
// أو باستخدام Object.assign:
Object.assign(element.style, {
color: 'red',
fontSize: '20px',
backgroundColor: 'yellow'
});
العمل مع الفئات
jQuery:
// إضافة فئة
$('#myDiv').addClass('active');
// إزالة فئة
$('#myDiv').removeClass('active');
// تبديل فئة
$('#myDiv').toggleClass('active');
// التحقق من وجود فئة
if ($('#myDiv').hasClass('active')) {
// افعل شيئاً
}
JavaScript العادي:
var element = document.querySelector('#myDiv');
// إضافة فئة
element.classList.add('active');
// إزالة فئة
element.classList.remove('active');
// تبديل فئة
element.classList.toggle('active');
// التحقق من وجود فئة
if (element.classList.contains('active')) {
// افعل شيئاً
}
💡 فوز JavaScript الحديثة: واجهة
classList نظيفة وسهلة تماماً مثل jQuery للعمل مع الفئات!
معالجة الأحداث
أحداث النقر
jQuery:
$('#myButton').click(function() {
alert('تم النقر!');
});
// أو باستخدام on()
$('#myButton').on('click', function() {
alert('تم النقر!');
});
JavaScript العادي:
document.querySelector('#myButton').addEventListener('click', function() {
alert('تم النقر!');
});
أحداث متعددة
jQuery:
$('#myInput').on('focus blur change', function() {
console.log('تم إطلاق الحدث');
});
JavaScript العادي:
var input = document.querySelector('#myInput');
['focus', 'blur', 'change'].forEach(function(event) {
input.addEventListener(event, function() {
console.log('تم إطلاق الحدث');
});
});
تفويض الحدث
jQuery:
// معالجة النقرات على العناصر المضافة ديناميكياً
$('#list').on('click', 'li', function() {
console.log('تم النقر على عنصر القائمة');
});
JavaScript العادي:
document.querySelector('#list').addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('تم النقر على عنصر القائمة');
}
});
Document Ready
jQuery:
$(function() {
// DOM جاهز
});
// أو
$(document).ready(function() {
// DOM جاهز
});
JavaScript العادي:
document.addEventListener('DOMContentLoaded', function() {
// DOM جاهز
});
// أو نهج حديث أبسط (إذا كان السكريبت في نهاية body):
// اكتب الكود مباشرة - لا حاجة للانتظار
إظهار/إخفاء العناصر
jQuery:
$('#myDiv').show();
$('#myDiv').hide();
$('#myDiv').toggle();
JavaScript العادي:
var element = document.querySelector('#myDiv');
// إظهار
element.style.display = 'block';
// إخفاء
element.style.display = 'none';
// تبديل
element.style.display = element.style.display === 'none' ? 'block' : 'none';
طلبات AJAX
jQuery:
$.ajax({
url: '/api/users',
method: 'GET',
success: function(data) {
console.log(data);
},
error: function(error) {
console.error(error);
}
});
// أو اختصار
$.get('/api/users', function(data) {
console.log(data);
});
JavaScript العادي (Fetch API):
fetch('/api/users')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
// أو مع async/await (حديث)
async function getUsers() {
try {
const response = await fetch('/api/users');
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
التكرار عبر العناصر
jQuery:
$('li').each(function(index, element) {
console.log(index, $(element).text());
});
JavaScript العادي:
var items = document.querySelectorAll('li');
items.forEach(function(element, index) {
console.log(index, element.textContent);
});
// أو دالة سهم حديثة
items.forEach((element, index) => {
console.log(index, element.textContent);
});
إنشاء العناصر
jQuery:
var newDiv = $('<div>', {
class: 'my-class',
text: 'مرحبا بالعالم'
});
$('body').append(newDiv);
JavaScript العادي:
var newDiv = document.createElement('div');
newDiv.className = 'my-class';
newDiv.textContent = 'مرحبا بالعالم';
document.body.appendChild(newDiv);
مثال مقارنة واقعي
لنبني قائمة مهام بسيطة بكلا النهجين:
نسخة jQuery
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(function() {
$('#addBtn').click(function() {
var text = $('#taskInput').val();
if (text) {
$('#taskList').append(
$('<li>').text(text)
);
$('#taskInput').val('');
}
});
$('#taskList').on('click', 'li', function() {
$(this).toggleClass('completed');
});
});
</script>
<style>
.completed { text-decoration: line-through; }
</style>
</head>
<body>
<input id="taskInput" placeholder="أدخل مهمة">
<button id="addBtn">إضافة</button>
<ul id="taskList"></ul>
</body>
</html>
نسخة JavaScript العادي
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener('DOMContentLoaded', function() {
var addBtn = document.querySelector('#addBtn');
var taskInput = document.querySelector('#taskInput');
var taskList = document.querySelector('#taskList');
addBtn.addEventListener('click', function() {
var text = taskInput.value;
if (text) {
var li = document.createElement('li');
li.textContent = text;
taskList.appendChild(li);
taskInput.value = '';
}
});
taskList.addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
e.target.classList.toggle('completed');
}
});
});
</script>
<style>
.completed { text-decoration: line-through; }
</style>
</head>
<body>
<input id="taskInput" placeholder="أدخل مهمة">
<button id="addBtn">إضافة</button>
<ul id="taskList"></ul>
</body>
</html>
متى تستخدم jQuery مقابل JavaScript العادي
| استخدم jQuery عندما | استخدم Vanilla JS عندما |
|---|---|
| العمل مع مشاريع قديمة | بناء تطبيقات حديثة خفيفة |
| تحتاج دعم عبر المتصفحات للمتصفحات القديمة | دعم المتصفحات الحديثة فقط |
| النماذج الأولية السريعة | الأداء حرج |
| استخدام إضافات jQuery | الحد الأدنى من التبعيات مطلوب |
| الفريق يفضل jQuery | العمل مع أطر عمل حديثة |
💡 أفضل ممارسة: في المشاريع الجديدة، ضع في اعتبارك JavaScript العادي أولاً. استخدم jQuery فقط إذا:
- تحتاج إلى توافق واسع عبر المتصفحات
- تستخدم إضافات jQuery
- فريقك أكثر راحة مع jQuery
- سرعة التطوير السريع أهم من الحجم الأدنى للملف
مقارنة الأداء
حجم الملف:
jQuery 3.7.1 (مصغر): ~87 KB JavaScript العادي: 0 KB (مدمج في المتصفح)مقارنة السرعة (اختيار 1000 عنصر):
document.querySelectorAll('div'): ~1-2ms
$('div'): ~3-5ms
📝 ملاحظة: اختلافات الأداء غالباً ما تكون ضئيلة لتطبيقات الويب النموذجية. اختر بناءً على احتياجات مشروعك، وليس فقط السرعة الخام.
🎯 تمرين تحدي:
أنشئ نفس الوظيفة باستخدام كل من jQuery وJavaScript العادي:
- نموذج بمدخلات الاسم والبريد الإلكتروني
- التحقق من المدخلات (ليست فارغة، تنسيق البريد الإلكتروني)
- عرض رسائل الخطأ
- عند النجاح، عرض البيانات أسفل النموذج
قارن طول الكود وتعقيد كلا النهجين.
💡 تلميح
للتحقق من البريد الإلكتروني، استخدم regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
الملخص
في هذا الدرس، تعلمت:
- JavaScript العادي الحديث يمكن أن يفعل معظم ما تفعله jQuery
- querySelector/querySelectorAll تستخدم نفس البناء مثل jQuery
- واجهة classList تجعل معالجة الفئات سهلة
- addEventListener هو نهج معالجة الأحداث الحديث
- Fetch API يحل محل jQuery.ajax() للمتصفحات الحديثة
- jQuery لا تزال قيمة لدعم القديم والتطوير السريع
- اختر الأداة المناسبة بناءً على متطلبات المشروع
مبروك! لقد أكملت الوحدة 1: أساسيات jQuery. أنت الآن تفهم بناء جملة jQuery والمحددات وكيف تقارن بـ JavaScript العادي. في الوحدة التالية، سنتعمق أكثر في معالجة DOM والأحداث!