تحسين تصفية المنتجات باستخدام JavaScript والفئات المتعددة
يتضمن إنشاء صفحات ويب ديناميكية وسهلة الاستخدام توفير تنقل سلس وتصفية سهلة للمحتوى. يعد هذا مفيدًا بشكل خاص عند عرض المنتجات أو العناصر التي تندرج ضمن فئات متعددة. باستخدام JavaScript، يمكننا تنفيذ طريقة بديهية لتصفية العناصر استنادًا إلى فئات متعددة، مما يسهل على المستخدمين العثور على ما يبحثون عنه بالضبط.
في هذا السيناريو، يؤدي النقر فوق زر الفئة إلى تصفية العناصر المعروضة على الصفحة. يجب أن يكون المستخدم قادرًا على تحديد فئات متعددة في وقت واحد، مما يسمح برؤية أكثر تخصيصًا للمنتجات. على سبيل المثال، يجب أن يؤدي تحديد "سمك السلمون" و"الروبيان" إلى إظهار العناصر التي تحتوي على كلا المكونين فقط.
في الوقت الحالي، تعمل العديد من التطبيقات بشكل جيد لتصفية فئة واحدة، ولكن إضافة فئات متعددة قد يكون أمرًا صعبًا. ويكمن التحدي في التأكد من أخذ جميع الفئات المحددة في الاعتبار عند تحديد العناصر التي سيتم إظهارها أو إخفاءها. تستكشف هذه المقالة كيفية توسيع تصفية الفئة الواحدة إلى تصفية الفئات المتعددة بطريقة فعالة باستخدام JavaScript.
في هذا الدليل، سنتعرف على حل يقوم بتصفية البطاقات ديناميكيًا استنادًا إلى أزرار نشطة متعددة، مما يوفر تجربة سهلة وسهلة الاستخدام. من خلال تطبيق حل JavaScript هذا، ستتعلم كيفية تحسين تفاعل صفحة الويب الخاصة بك وتعزيز مشاركة المستخدم.
يأمر | مثال للاستخدام |
---|---|
every() | The every() method is used to check if all selected categories match the categories of each card. This is crucial in ensuring that multiple category filters work correctly. For example, activeCategories.every(cat =>تُستخدم الطريقة every() للتحقق مما إذا كانت جميع الفئات المحددة تتطابق مع فئات كل بطاقة. يعد هذا أمرًا بالغ الأهمية لضمان عمل عوامل تصفية الفئات المتعددة بشكل صحيح. على سبيل المثال، activeCategories.every(cat =>cardCategories.includes(cat)) يضمن أن كافة الفئات المحددة موجودة ضمن فئات البطاقة. |
toggle() | يقوم هذا الأمر بتبديل الفصل الدراسي أو إيقاف تشغيله. يتم استخدامه لإضافة فئة الزر النشط أو إزالتها ديناميكيًا من زر الفئة عند النقر عليه. ويساعد ذلك في تتبع ما إذا كان الزر نشطًا، مما يؤثر على البطاقات المعروضة أو المخفية. |
filter() | The filter() method creates a new array with all elements that pass a test. In the Node.js example, products.filter(product => selectedCategories.every(cat =>يقوم أسلوب التصفية () بإنشاء مصفوفة جديدة تحتوي على جميع العناصر التي تجتاز الاختبار. في مثال Node.js، تقوم Products.filter(product =>selectedCategories.every(cat => Product.categories.includes(cat))) بتصفية المنتجات بناءً على الفئات المحددة بواسطة المستخدم. |
split() | يتم استخدام طريقة التقسيم () لتحويل سلسلة من الفئات إلى مصفوفة. على سبيل المثال، تقومcard.getAttribute("data-category").split("،") بتقسيم سلسلة الفئة المفصولة بفواصل إلى مصفوفة لتسهيل المقارنة مع الفئات النشطة. |
classList.add() | تضيف هذه الطريقة فئة محددة إلى عنصر. يتم استخدامه لإضافة فئة البطاقة غير النشطة لإخفاء البطاقات التي لا تتطابق مع عوامل التصفية النشطة. على سبيل المثال، Card.classList.add("inactive-card") يخفي البطاقة عندما لا تتطابق فئاتها مع الفئات المحددة. |
trim() | يتم استخدام طريقة القطع () لإزالة المسافات البيضاء من طرفي السلسلة. في البرنامج النصي، يضمن مقارنة الفئات من الأزرار بشكل واضح مع الفئات من بيانات المنتج. على سبيل المثال، يضمن Button.innerText.trim() عدم أخذ أي مسافات إضافية في الاعتبار. |
post() | في البرنامج النصي للواجهة الخلفية، يتم استخدام post() لإنشاء مسار يقبل البيانات المرسلة من قبل العميل (في هذه الحالة، الفئات المحددة). يقوم البرنامج النصي من جانب الخادم بمعالجة هذا الطلب لإرجاع بيانات المنتج التي تمت تصفيتها بناءً على الفئات المحددة. |
json() | تُستخدم هذه الطريقة في Express لإرسال استجابة JSON مرة أخرى إلى العميل. على سبيل المثال، يقوم res.json(filteredProducts) بإرجاع المنتجات التي تطابق الفئات المحددة، مما يسمح لجانب العميل بعرض المنتجات التي تمت تصفيتها. |
فهم التصفية متعددة الفئات في JavaScript
تركز البرامج النصية المقدمة أعلاه على تصفية العناصر ديناميكيًا استنادًا إلى فئات متعددة، وهو أمر ضروري لتحسين تجربة المستخدم على مواقع الويب القائمة على المنتجات. الهدف هو السماح للمستخدمين بتحديد فئات متعددة وتصفية البطاقات وفقًا لذلك. يتم تحقيق ذلك باستخدام JavaScript عن طريق التقاط نقرات الزر، وتخزين الفئات المحددة في مصفوفة، ثم عرض البطاقات التي تطابق جميع الفئات المحددة فقط. تبدأ العملية عندما ينقر المستخدم على زر الفئة، مما يؤدي إلى تبديل الحالة النشطة لذلك الزر. يتم تخزين قيمة الزر في مصفوفة تمثل جميع عوامل التصفية النشطة.
جزء مهم من هذا الحل هو استخدام طريقة الصفيف كل(). يضمن هذا الأمر مقارنة كافة الفئات المحددة بفئات البطاقة. فهو يتحقق مما إذا كانت كل فئة نشطة موجودة ضمن فئات البطاقة، وبالتالي يسمح للتصفية متعددة الفئات بالعمل بسلاسة. طريقة أخرى مهمة هي ينقسم()، والذي يُستخدم لتقسيم سلسلة الفئات من كل بطاقة إلى مصفوفة. يؤدي ذلك إلى تمكين JavaScript من مقارنة الفئات الفردية وتحديد البطاقات التي يجب عرضها أو إخفاؤها.
وبالإضافة إلى ذلك، يستخدم البرنامج النصي classList.toggle() لإضافة أو إزالة الفئة النشطة على الأزرار عند النقر عليها. تعتبر هذه الفئة ضرورية للتعليقات المرئية، لأنها تشير إلى الأزرار النشطة حاليًا. عند إلغاء تنشيط الزر، تتم إزالة فئته من مجموعة الفئات النشطة، ويتم تشغيل وظيفة التصفية مرة أخرى لتحديث العرض. يتم إخفاء البطاقات التي لا تتطابق مع الفئات النشطة عن طريق إضافة فئة لوضع علامة عليها على أنها غير نشطة. تضمن هذه الطريقة أنه يمكن للمستخدمين تحسين بحثهم بسهولة عن طريق تحديد أو إلغاء تحديد مرشحات متعددة.
تم تصميم البرنامج النصي الخلفي للتعامل مع تصفية المنتج على جانب الخادم باستخدام Node.js وExpress. يتم إرسال الفئات المحددة إلى الخادم من خلال طلب POST، ويقوم الخادم بمعالجة هذا الطلب عن طريق تصفية المنتجات وإرجاع العناصر التي تطابق الفئات النشطة فقط. يستخدم الخادم نفس منطق الواجهة الأمامية، وذلك باستخدام فلتر() طريقة لمقارنة الفئات المختارة مع فئات كل منتج. يعد هذا الأسلوب مفيدًا عند التعامل مع مجموعات البيانات الكبيرة، حيث أنه يحرر المعالجة من جانب العميل، مما يؤدي إلى أداء أفضل للمستخدمين النهائيين.
تصفية العناصر الديناميكية باستخدام JavaScript: تصفية مُحسّنة متعددة الفئات
نهج تطوير الواجهة الأمامية باستخدام Vanilla JavaScript
// Define product data
let products = {
data: [
{ productName: "Fantasy", category: "Salmon, Shrimp" },
{ productName: "Spring", category: "Veggie" },
{ productName: "Rainbow", category: "Salmon, Tuna, Unagi" },
{ productName: "Unique", category: "Salmon, Tuna, Unagi, Shrimp" },
{ productName: "Perfection", category: "Salmon" },
]
};
// Handle button click event
let activeCategories = [];
document.querySelectorAll(".category-button").forEach(button => {
button.addEventListener("click", () => {
const category = button.innerText.trim();
button.classList.toggle("active-button");
if (button.classList.contains("active-button")) {
activeCategories.push(category);
} else {
activeCategories = activeCategories.filter(cat => cat !== category);
}
filterCards();
});
});
// Filter cards based on active categories
function filterCards() {
document.querySelectorAll(".card").forEach(card => {
const cardCategories = card.getAttribute("data-category").split(",");
const match = activeCategories.every(cat => cardCategories.includes(cat));
card.style.display = match ? "block" : "none";
});
}
تنفيذ الواجهة الخلفية لتصفية العناصر الديناميكية
النهج من جانب الخادم باستخدام Node.js وExpress
const express = require('express');
const app = express();
app.use(express.json());
// Sample product data
const products = [
{ name: 'Fantasy', categories: ['Salmon', 'Shrimp'] },
{ name: 'Spring', categories: ['Veggie'] },
];
// Filter products API
app.post('/filter', (req, res) => {
const selectedCategories = req.body.categories;
const filteredProducts = products.filter(product =>
selectedCategories.every(cat => product.categories.includes(cat))
);
res.json(filteredProducts);
});
app.listen(3000, () => console.log('Server running on port 3000'));
التقنيات المتقدمة للتصفية متعددة الفئات في تطوير الويب
عند تنفيذ نظام تصفية متعدد الفئات في جافا سكريبت، من المهم ألا تأخذ في الاعتبار تفاعل واجهة المستخدم فحسب، بل أيضًا بنية البيانات التي تدعمه. في سياق المحتوى الديناميكي، الحفاظ على الأمثل والنظيف DOM استراتيجية التلاعب هي المفتاح. على سبيل المثال، يمكنك استخدام تقنيات تفويض الأحداث للتعامل مع أزرار الفئات المتعددة بكفاءة، مما يضمن معالجة عناصر DOM المطلوبة فقط.
أحد الجوانب التي يمكن أن تعزز تجربة التصفية بشكل أكبر هو إضافة عناصر واجهة مستخدم أكثر تعقيدًا، مثل مربعات الاختيار أو القوائم المنسدلة متعددة التحديد، بدلاً من الأزرار البسيطة. يتيح ذلك للمستخدمين التفاعل مع المرشحات بطريقة أكثر تفصيلاً. على سبيل المثال، توفر القائمة المنسدلة التي تسمح بتحديدات متعددة واجهة مستخدم أكثر وضوحًا ومرونة أكبر للمستخدمين عند اختيار الفئات. يمكن تنفيذ ذلك باستخدام منطق وتصميم JavaScript إضافيين، مع الاستمرار في استخدام أساليب المصفوفة مثل filter() و every() لمقارنة الفئة.
هناك اعتبار حاسم آخر وهو أداء نظام التصفية، خاصة عند التعامل مع مجموعة كبيرة من البيانات. عندما يكون لديك مئات أو آلاف العناصر التي تريد تصفيتها، فمن الضروري تقليل معالجة DOM قدر الإمكان. إحدى الطرق لتحسين ذلك هي تجميع التحديثات على DOM باستخدام requestAnimationFrame() أو debounce() طرق للتحكم في معدل التحديثات وضمان تجربة مستخدم سلسة. لا تعمل هذه التقنيات على تحسين الأداء فحسب، بل تعمل أيضًا على تحسين استجابة الصفحة، مما يجعلها أكثر قابلية للتوسع لمجموعات البيانات الأكبر حجمًا.
الأسئلة المتداولة حول التصفية متعددة الفئات في JavaScript
- كيف يمكنني التعامل مع عوامل التصفية النشطة المتعددة؟
- يمكنك تخزين المرشحات النشطة في مصفوفة واستخدامها every() للتحقق مما إذا كانت فئة كل بطاقة تتطابق مع عوامل التصفية المحددة.
- ماذا يحدث إذا كان لدي فئات متداخلة؟
- استخدام split() و trim()، يمكنك فصل بيانات الفئة وتنظيفها، مما يضمن مقارنة كل فئة بشكل صحيح مع عوامل التصفية النشطة.
- كيف يمكنني تحسين التصفية لمجموعات البيانات الكبيرة؟
- تحديثات DOM الدفعية باستخدام requestAnimationFrame() أو تنفيذ أ debounce() وظيفة لتقليل وتيرة عمليات التصفية، وتحسين الأداء.
- كيف أقوم بعرض العناصر المطابقة لجميع الفئات المحددة؟
- يستخدم every() للتأكد من تضمين كافة الفئات المحددة في بيانات كل بطاقة قبل إظهارها.
- ما هي أفضل طريقة للتعامل مع الصور المكسورة في نظام البطاقة؟
- تنفيذ error مستمع الأحداث على كل صورة لإخفاء الصورة أو استبدالها عند فشل التحميل، مما يعزز تجربة المستخدم.
الأفكار النهائية حول تقنيات تصفية جافا سكريبت
يمكن أن يؤدي تنفيذ التصفية متعددة الفئات في صفحات الويب إلى تحسين تجربة المستخدم بشكل كبير، مما يسهل على المستخدمين العثور على ما يحتاجون إليه بالضبط. مع الاستخدام الدقيق ل جافا سكريبت أساليب مثل تبديل () و كل()، يمكن للمطورين إنشاء حل فعال وقابل للتطوير يتعامل مع مجموعات البيانات الكبيرة بسلاسة.
علاوة على ذلك، من خلال تحسين معالجة DOM وتقليل العمليات غير الضرورية، يضمن هذا النهج الأداء حتى مع تفاعل المستخدم العالي. يمكن دمج نظام التصفية هذا في مواقع التجارة الإلكترونية أو المحافظ أو أي صفحة تتطلب عرض محتوى ديناميكي بناءً على عوامل تصفية متعددة.
قسم المصادر والمراجع
- تم استلهام أمثلة المحتوى والتعليمات البرمجية الواردة في هذه المقالة من مثال CodePen الذي قدمته Alena Chuyankova. يمكنك استكشاف الكود الأصلي هنا: ألينا CodePen .
- تمت الإشارة إلى مفاهيم إضافية حول أساليب مصفوفة JavaScript ومعالجة الأحداث من الوثائق الرسمية لشبكة مطوري Mozilla، والتي يمكن الوصول إليها هنا: مستندات ويب MDN .
- لمزيد من الأفكار حول تحسين معالجة DOM والأداء باستخدام JavaScript، أشرت إلى هذا الدليل الشامل من Smashing Magazine: فهم DOM الفعال .