لوقت طويل ، توجد وظائف JavaScript التي تسمح لنا بإنشاء واجهات السحب والإفلات ، ولكن لم تكن أي من هذه التطبيقات محلية في المتصفح.

في HTML5 ، لدينا طريقة أصلية لإنشاء واجهات السحب والإفلات (مع القليل من المساعدة من JavaScript).

سأترك لك كيفية تحقيق ذلك ...

دعم المتصفح

أود الخروج عن هذا الطريق قبل أن نتقدم: يتم حاليًا دعم عملية السحب والإفلات بتنسيق HTML5 بواسطة جميع متصفحات سطح المكتب الرئيسية (بما في ذلك IE (حتى IE 5.5 يحتوي على دعم جزئي)) ولكنه غير مدعوم حاليًا بواسطة أي من أجهزة الجوال الشائعة المتصفحات.

سحب وإسقاط الأحداث

في كل مرحلة من عملية السحب والإسقاط يتم تشغيل حدث مختلف بحيث يعرف المتصفح تعليمات JavaScript البرمجية ؛ الأحداث هي:

  • dragStart: يتم إطلاق النار عند بدء المستخدم في سحب العنصر.
  • dragEnter: يتم إطلاقها عند سحب عنصر السحب لأول مرة فوق العنصر الهدف.
  • dragOver: يتم إطلاق النار عند تحريك الماوس فوق عنصر عند حدوث السحب.
  • dragLeave: يتم إطلاقه إذا ترك مؤشر المستخدم عنصرًا عند السحب.
  • السحب: يتم إطلاق النار في كل مرة نقوم فيها بتحريك الماوس أثناء سحب عنصرنا.
  • إسقاط: يتم إطلاقه عند إجراء الانخفاض الفعلي.
  • dragEnd: الحرائق عند قيام المستخدم بتحرير الماوس أثناء سحب الكائن.

مع كل هؤلاء المستمعين للحدث ، لديك الكثير من التحكم في كيفية عمل الواجهة الخاصة بك بالضبط وكيف تؤدي في ظروف مختلفة.

كائن dataTransfer

هذا هو المكان الذي يحدث كل السحب والإسقاط. يحتفظ هذا الكائن بالبيانات التي تم إرسالها بواسطة عملية السحب. يمكن ضبط البيانات واسترجاعها بطرق مختلفة ، أهمها:

  • dataTransfer.effectAllowed = value: يؤدي هذا إلى إرجاع أنواع الإجراءات المسموح بها ، والقيم المحتملة هي لا شيء ، ونسخ ، و copyLink ، و copyMove ، و link ، و linkMove ، والانتقال ، وكل ذلك وغير مهيأ.
  • dataTransfer.setData (التنسيق ، البيانات): يضيف البيانات المحددة وتنسيقها.
  • dataTransfer.clearData (التنسيق): يمسح كل البيانات الخاصة بتنسيق محدد.
  • dataTransfer.setDragImage (element، x، y): يقوم بتعيين الصورة التي تريد سحبها ، وتحدد قيم x و y مكان مؤشر الماوس (0 ، 0 سيضعه أعلى اليسار).
  • data = dataTransfer.getData (التنسيق): حيث أن الاسم يقول أنه يقوم بإرجاع البيانات المتاحة لتنسيق محدد.

إنشاء مثال السحب والإفلات

الآن سنبدأ في إنشاء مثال بسيط للسحب والإفلات ، يمكنك أن ترى أن لدينا قسمين صغيرين وأكبر ، يمكننا سحب وإسقاط تلك الصغيرة داخل الكبيرة ويمكننا حتى نقلها مرة أخرى.

سحب الكائن

أول شيء يتعين علينا القيام به هو إنشاء HTML الخاص بنا. نحن نجعل الأقسام قابلة للسحب باستخدام السمة القابلة للسحب ، مثل:

draggable="true">

عند الانتهاء من ذلك ، نحتاج إلى تعريف وظيفة javascript التي سيتم تشغيلها عندما نبدأ في سحب هذا العنصر:

function dragStart(ev) {ev.dataTransfer.effectAllowed='move';ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));   ev.dataTransfer.setDragImage(ev.target,100,100);return true;}

في هذا الكود ، نعلن أولاً عن نوع التأثير الذي نسمح به في العملية ونقوم بتعيينه للتحريك ، وفي السطر الثاني ، نقوم بتعيين البيانات الخاصة بالعملية وفي هذه الحالة ، يكون النوع هو النص والقيمة هي معرف العنصر نحن نسحب. بعد ذلك نستخدم طريقة setDragImage لضبط ما سنسحبه ومن ثم موضع المؤشر أثناء السحب ، وبما أن المكعبات 200 في 200 بكسل ، فإنني أضعها في المركز. أخيرا نعود صحيح.

اسقاط الكائن

من أجل قبول عنصر ما لقطرة ما ، يجب الاستماع إلى 3 أحداث مختلفة: dragEnter و dragOver وأيضًا حدث الإفلات لذا دعنا نضيف هذا إلى html الخاص بنا في div بمعرف كبير:

الآن بعد أن أضفنا مستمعي الأحداث ، نحتاج إلى إنشاء هذه الوظائف ، سنبدأ من أحداث dragenter و dragover:

function dragEnter(ev) {ev.preventDefault();return true;}function dragOver(ev) {ev.preventDefault();}

في الوظيفة الأولى ، نحدد ما نريد أن يحدث عندما يصل العنصر الذي نقوم بسحبه إلى العنصر الذي من المفترض أن يتم إسقاطه ، وفي هذه الحالة نحن فقط نحول دون السلوك الافتراضي للمتصفح ولكن يمكنك القيام بأي عدد من الأشياء مثل تغيير الخلفية أو إضافة بعض النص للإشارة إلى أن المستخدم يتم سحبه إلى المنطقة الصحيحة واستخدام الحدث dragleave يمكنك العودة التغييرات التي أجريتها. بعد ذلك في وظيفة dragOver نقوم ببساطة بمنع الافتراضي للسماح بالتراجع.

الجزء التالي هو المكان الذي نحدد فيه الوظيفة عندما نسقط العنصر فعليًا في الهدف المطلوب:

function dragDrop(ev) {var data = ev.dataTransfer.getData("Text");ev.target.appendChild(document.getElementById(data));ev.stopPropagation();return false;}

في هذا الجزء الأخير قمنا أولاً بتعيين متغير يسمى البيانات التي نحصل فيها على جميع البيانات المتوفرة لتنسيق النص ، ثم نرفق هذه البيانات (التي ستكون العنصر الذي نقوم بسحبه) إلى div حيث نرغب في إسقاط العنصر. وأخيرا بعض اللمسات الأخيرة مثل وقف انتشار وعودة كاذبة أيضا.

جعل هذا القسم هدفًا مستهدفًا

تدقيق التجريبي ، يمكنك أن ترى أيضًا أننا تأكدنا من إمكانية سحب العنصرين إلى موقعهما الأصلي. لحسن الحظ ، قد يكون إضافة هدف إسقاط آخر أبسط مما تعتقد ؛ لأن الوظائف موجودة بالفعل ، كل ما علينا القيام به هو إضافة المستمعين للحدث ، مثل:

وهذا كل ما نحتاج إليه للسماح بسحب الأقسام إلى المكان الأصلي.

استنتاج

هناك الكثير من تطبيقات السحب والإسقاط التي تم إنشاؤها باستخدام مكتبات JavaScript ، وغالبًا ما يكون استخدام هذه المكتبات أسهل بكثير. ولكنني آمل أن ترى في تقنية HTML5 و JavaScript هذه الإمكانية المستقبلية للحل المحلي.

هل قمت ببناء واجهة السحب والإفلات؟ كيف يمكن مقارنة HTML5 الأصلي بحلول جافا سكريبت الخالصة؟ اسمحوا لنا أن نعرف في التعليقات.

صورة مميزة / صورة مصغرة ، إسقاط الصورة عن طريق photophilde.