jQuery والتعامل مع DOM

التعامل مع خصائص البيانات

12 دقيقة الدرس 12 من 30

التعامل مع خصائص البيانات

توفر خصائص البيانات في HTML5 طريقة موحدة لتخزين البيانات المخصصة على العناصر. تجعل دالة .data() في jQuery التعامل مع هذه الخصائص بسيطاً وفعالاً.

ما هي خصائص البيانات؟

خصائص البيانات هي خصائص مخصصة تبدأ بـ data-. تسمح لك بتضمين بيانات مخصصة داخل عناصر HTML دون استخدام خصائص غير قياسية.

HTML:
<div id="product"
     data-id="12345"
     data-name="Laptop"
     data-price="999.99"
     data-in-stock="true"
     data-category="electronics">
    MacBook Pro
</div>

دالة .data()

توفر دالة .data() طريقة مريحة لتخزين واسترجاع البيانات المرتبطة بالعناصر.

الحصول على البيانات:
// الحصول على خاصية بيانات واحدة
var productId = $("#product").data("id");
console.log(productId); // "12345"

var price = $("#product").data("price");
console.log(price); // "999.99"

// الحصول على جميع خصائص البيانات ككائن
var allData = $("#product").data();
console.log(allData);
// {id: "12345", name: "Laptop", price: "999.99", inStock: "true", category: "electronics"}
تعيين البيانات:
// تعيين قيمة بيانات واحدة
$("#product").data("discount", "10%");

// تعيين قيم بيانات متعددة
$("#product").data({
    seller: "TechStore",
    warranty: "2 years",
    rating: 4.5
});

// البيانات محفوظة في ذاكرة jQuery الداخلية
console.log($("#product").data("seller")); // "TechStore"
مهم: عند استخدام .data() لتعيين القيم، يتم تخزين البيانات في ذاكرة jQuery الداخلية، وليس كخصائص HTML. لتعيين خصائص بيانات HTML فعلية، استخدم .attr("data-name", value).

تحويل نوع البيانات

تقوم jQuery تلقائياً بتحويل قيم خصائص البيانات إلى أنواع JavaScript المناسبة.

HTML:
<div id="demo"
     data-string="hello"
     data-number="42"
     data-float="3.14"
     data-boolean="true"
     data-null="null"
     data-json='{"name":"أحمد","age":30}'>
</div>
JavaScript:
var string = $("#demo").data("string");
console.log(typeof string); // "string"

var number = $("#demo").data("number");
console.log(typeof number); // "number"

var float = $("#demo").data("float");
console.log(typeof float); // "number"

var boolean = $("#demo").data("boolean");
console.log(typeof boolean); // "boolean"

var nullValue = $("#demo").data("null");
console.log(nullValue); // null

var json = $("#demo").data("json");
console.log(typeof json); // "object"
console.log(json.name); // "أحمد"

اصطلاح التسمية

أسماء خصائص البيانات في HTML تستخدم الحالة المفصولة بشرطة، لكن jQuery تحولها إلى الحالة الجملية عند الوصول عبر .data().

HTML:
<div id="user"
     data-first-name="أحمد"
     data-last-name="محمد"
     data-user-id="123">
</div>
JavaScript:
// الوصول باستخدام الحالة الجملية
var firstName = $("#user").data("firstName");  // "أحمد"
var lastName = $("#user").data("lastName");    // "محمد"
var userId = $("#user").data("userId");        // "123"

// التعيين باستخدام الحالة الجملية
$("#user").data("fullName", "أحمد محمد");

// هذا ينشئ data-full-name في ذاكرة jQuery

دالة .removeData()

استخدم .removeData() لإزالة البيانات المخزنة بواسطة jQuery.

JavaScript:
// إزالة عنصر بيانات واحد
$("#product").removeData("discount");

// إزالة عناصر بيانات متعددة
$("#product").removeData("seller warranty");

// إزالة جميع البيانات
$("#product").removeData();
تحذير: .removeData() تزيل البيانات من ذاكرة jQuery الداخلية فقط. لا تزيل خصائص HTML data-*. استخدم .removeAttr() لإزالة خصائص HTML.

مثال عملي: بطاقات المنتجات مع التفاصيل

HTML:
<div class="products">
    <div class="product-card"
         data-id="1"
         data-name="ماوس لاسلكي"
         data-price="29.99"
         data-image="mouse.jpg"
         data-stock="15">
        <h3>ماوس لاسلكي</h3>
        <button class="view-details">عرض التفاصيل</button>
        <button class="add-to-cart">إضافة للسلة</button>
    </div>

    <div class="product-card"
         data-id="2"
         data-name="لوحة مفاتيح ميكانيكية"
         data-price="79.99"
         data-image="keyboard.jpg"
         data-stock="8">
        <h3>لوحة مفاتيح ميكانيكية</h3>
        <button class="view-details">عرض التفاصيل</button>
        <button class="add-to-cart">إضافة للسلة</button>
    </div>
</div>

<div id="product-modal" style="display: none;">
    <h2 id="modal-name"></h2>
    <img id="modal-image" src="" alt="">
    <p>السعر: $<span id="modal-price"></span></p>
    <p>متوفر: <span id="modal-stock"></span></p>
    <button id="close-modal">إغلاق</button>
</div>
JavaScript:
$(document).ready(function() {
    // عرض تفاصيل المنتج
    $(".view-details").click(function() {
        var card = $(this).closest(".product-card");
        var productData = card.data();

        $("#modal-name").text(productData.name);
        $("#modal-price").text(productData.price);
        $("#modal-stock").text(productData.stock);
        $("#modal-image").attr({
            src: "images/" + productData.image,
            alt: productData.name
        });

        $("#product-modal").show();
    });

    // إضافة إلى السلة
    $(".add-to-cart").click(function() {
        var card = $(this).closest(".product-card");
        var productData = card.data();

        // تخزين بيانات عنصر السلة
        var cartItem = {
            id: productData.id,
            name: productData.name,
            price: productData.price,
            quantity: 1
        };

        // إضافة تغذية راجعة مرئية
        card.data("in-cart", true);
        $(this).text("تمت الإضافة!").prop("disabled", true);

        console.log("تمت الإضافة إلى السلة:", cartItem);

        // إعادة التفعيل بعد ثانيتين
        setTimeout(function() {
            $(this).text("إضافة للسلة").prop("disabled", false);
        }.bind(this), 2000);
    });

    // إغلاق النافذة المنبثقة
    $("#close-modal").click(function() {
        $("#product-modal").hide();
    });
});

مثال عملي: علامات التبويب مع محتوى ديناميكي

HTML:
<div class="tab-container">
    <button class="tab-btn active" data-tab="home" data-icon="🏠">الرئيسية</button>
    <button class="tab-btn" data-tab="about" data-icon="ℹ️">من نحن</button>
    <button class="tab-btn" data-tab="services" data-icon="⚙️">الخدمات</button>
    <button class="tab-btn" data-tab="contact" data-icon="📧">اتصل بنا</button>
</div>

<div id="tab-content">
    <div class="tab-panel active" id="home">محتوى الرئيسية</div>
    <div class="tab-panel" id="about">محتوى من نحن</div>
    <div class="tab-panel" id="services">محتوى الخدمات</div>
    <div class="tab-panel" id="contact">محتوى اتصل بنا</div>
</div>
JavaScript:
$(document).ready(function() {
    $(".tab-btn").click(function() {
        var tabId = $(this).data("tab");
        var tabIcon = $(this).data("icon");

        // إزالة الفئة النشطة من جميع التبويبات واللوحات
        $(".tab-btn").removeClass("active");
        $(".tab-panel").removeClass("active");

        // إضافة الفئة النشطة للتبويب المنقور واللوحة المقابلة
        $(this).addClass("active");
        $("#" + tabId).addClass("active");

        // تخزين التبويب الحالي في البيانات
        $(".tab-container").data("currentTab", tabId);

        // تسجيل التحليلات
        console.log("تم عرض التبويب:", tabId, tabIcon);

        // تخزين عدد المشاهدات
        var viewCount = $(this).data("viewCount") || 0;
        $(this).data("viewCount", viewCount + 1);
        console.log("تمت مشاهدة هذا التبويب " + (viewCount + 1) + " مرات");
    });

    // التهيئة بتبويب الرئيسية
    $(".tab-container").data("currentTab", "home");
});

استخدام خصائص البيانات للتكوين

HTML:
<div class="slider"
     data-autoplay="true"
     data-interval="3000"
     data-loop="true"
     data-animation="fade">
    <!-- محتوى السلايدر -->
</div>
JavaScript:
$(document).ready(function() {
    $(".slider").each(function() {
        var config = $(this).data();

        console.log("إعدادات السلايدر:", config);
        // {autoplay: true, interval: 3000, loop: true, animation: "fade"}

        if (config.autoplay) {
            // بدء التشغيل التلقائي بالفاصل الزمني المحدد
            setInterval(function() {
                // منطق الانزلاق هنا
            }, config.interval);
        }

        // تطبيق نمط الحركة
        $(this).attr("data-animation-style", config.animation);
    });
});
تمرين:
  1. أنشئ قائمة مستخدمين حيث كل بطاقة مستخدم لديها خصائص بيانات لـ: id، name، email، role، و status
  2. أضف زر "عرض الملف الشخصي" يعرض بيانات المستخدم في نافذة منبثقة
  3. أضف أزرار تصفية (الكل، نشط، غير نشط) تُظهر/تُخفي المستخدمين بناءً على خاصية حالتهم
  4. أضف زر "تبديل الحالة" يغيّر حالة المستخدم ويحدّث العرض
  5. تتبع عدد مرات عرض كل ملف شخصي باستخدام تخزين بيانات jQuery

الملخص

  • .data(key) - الحصول على قيمة خاصية البيانات
  • .data() - الحصول على جميع خصائص البيانات ككائن
  • .data(key, value) - تعيين قيمة البيانات (محفوظة في ذاكرة jQuery)
  • .removeData(key) - إزالة البيانات من ذاكرة jQuery
  • خصائص البيانات تستخدم الحالة المفصولة في HTML، الحالة الجملية في JavaScript
  • تُحوّل jQuery أنواع البيانات تلقائياً (نصوص، أرقام، منطقية، كائنات)
  • استخدم خصائص البيانات لتخزين البيانات الوصفية والتكوين
  • .data() تُخزن في الذاكرة؛ .attr() تُعدّل HTML

ES
Edrees Salih
منذ 21 ساعة

We are still cooking the magic in the way!