attribute - jquery set input value




أفضل طريقة لإزالة معالج أحداث في jQuery؟ (12)

لدي input type="image" . هذا يعمل مثل الملاحظات الخلية في Microsoft Excel. إذا قام شخص ما بإدخال رقم في مربع النص بحيث يتم إقران input-image هذه ، فأنا أقوم بإعداد معالج أحداث input-image . ثم عندما ينقر المستخدم على image ، سيحصل على بعض النوافذ المنبثقة لإضافة بعض الملاحظات إلى البيانات.

مشكلتي هي أنه عندما يقوم مستخدم بإدخال صفر في مربع النص ، أحتاج إلى تعطيل معالج الأحداث الخاص input-image . لقد حاولت ما يلي ، ولكن دون جدوى.

$('#myimage').click(function { return false; });

jQuery ≥ 1.7

باستخدام jQuery 1.7 فصاعدًا ، تم تحديث واجهة برمجة تطبيقات الحدث ، لا يزال .bind() / .unbind() متوفرًا للتوافق مع الإصدارات السابقة ، ولكن الطريقة المفضلة هي استخدام الدالات on() / off() . أدناه سيكون الآن ،

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery <1.7

في شفرة المثال الخاص بك ، ما عليك سوى إضافة حدث نقرة آخر إلى الصورة ، وليس تجاوز الحدث السابق:

$('#myimage').click(function() { return false; }); // Adds another click event

بعد ذلك ستتم إزالة كل من أحداث النقر.

كما قال الأشخاص ، يمكنك استخدام unbind لإزالة جميع أحداث النقرات:

$('#myimage').unbind('click');

إذا كنت تريد إضافة حدث واحد ثم إزالته (بدون إزالة أي ملفات أخرى قد تمت إضافتها) ، فيمكنك استخدام ميزة namespacing:

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

وإزالة الحدث الخاص بك فقط:

$('#myimage').unbind('click.mynamespace');

remove جميع event-handlers ، كان هذا هو ما نجحت بالنسبة لي:

لإزالة جميع معالجات الأحداث تعني أن يكون لديك HTML structure واضحة دون أن تكون جميع event handlers مرتبطة element child nodes . للقيام بذلك ، ساعد jQuery's clone() .

var original, clone;
// element with id my-div and its child nodes have some event-handlers
original = $('#my-div');
clone = original.clone();
//
original.replaceWith(clone);

باستخدام هذا ، سيكون لدينا clone بدلاً من النسخة original دون وجود event-handlers عليها.

حظا طيبا وفقك الله...


أعلم أن هذا يأتي في وقت متأخر ، ولكن لماذا لا تستخدم JS عاديًا لإزالة الحدث؟

var myElement = document.getElementByID("your_ID");
myElement.onclick = null;

أو إذا كنت تستخدم دالة مسماة كمعالج أحداث:

function eh(event){...}
var myElement = document.getElementByID("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it

أفضل طريقة لإزالة حدث onclick مضمنة هي $(element).prop('onclick', null);


إذا قمت بتعيين onclick عبر html تحتاج إلى removeAttr ($(this).removeAttr('onclick'))

إذا قمت بتعيينه عبر jquery (كما هو الحال بعد النقرة الأولى في الأمثلة أعلاه) فأنت بحاجة إلى unbind($(this).unbind('click'))


إذا كنت تريد الرد على حدث مرة واحدة فقط ، فيجب أن يكون بناء الجملة التالي مفيدًا حقًا:

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

باستخدام arguments.callee ، يمكننا التأكد من إزالة معالج الدالة المجهول المحدد ، وبالتالي ، يكون معالج وقت واحد لحدث معين. آمل أن يساعد هذا الآخرين.


ربما ستعمل طريقة unbind بالنسبة لك

$("#myimage").unbind("click");

في حالة .on() طريقة .on() مسبقًا مع محدد محدد ، كما في المثال التالي:

$('body').on('click', '.dynamicTarget', function () {
    // Code goes here
});

كلا الطرق .off() unbind() و .off() لن تنجح.

ومع ذلك ، يمكن استخدام طريقة .undelegate() لإزالة المعالج تمامًا من الحدث لجميع العناصر التي تطابق المحدد الحالي:

$("body").undelegate(".dynamicTarget", "click")

لم تنجح جميع الطرق الموضحة بالنسبة لي لأنني كنت أقوم بإضافة حدث النقر مع on() إلى المستند الذي تم إنشاؤه في وقت التشغيل:

$(document).on("click", ".button", function() {
    doSomething();
});


الحل الخاص بي:

بما أنني لم أتمكن من فصل فئة ".button" ، قمت بتعيين فئة أخرى إلى الزر الذي كان يحتوي على نفس أنماط CSS. من خلال إجراء ذلك ، تجاهل معالج البث المباشر - على - الحدث النقرة أخيرًا:

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");

امل ان يساعد.


لم يكن هذا متاحًا عند الإجابة على هذا السؤال ، ولكن يمكنك أيضًا استخدام طريقة live() لتمكين / تعطيل الأحداث.

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

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

هذا له فوائد أخرى بإضافة التصميم على أساس تلك الفئة أيضًا.


واضطررت إلى تعيين الحدث إلى null باستخدام prop و attr. لم أستطع فعل ذلك مع واحد أو آخر. أنا أيضا لا يمكن أن تحصل على .unbind للعمل. أنا أعمل على عنصر TD.

.prop("onclick", null).attr("onclick", null)

يمكن القيام بذلك عن طريق استخدام وظيفة unbind.

$('#myimage').unbind('click');

يمكنك إضافة معالجات أحداث متعددة لنفس الكائن والحدث في jquery. هذا يعني أن إضافة واحدة جديدة لا تحل محل القديمة.

هناك العديد من الاستراتيجيات لتغيير معالجات الأحداث ، مثل مساحات أسماء الأحداث. هناك بعض الصفحات حول هذا في مستندات الإنترنت.

انظر إلى هذا السؤال (هكذا علمت من unbind). هناك بعض وصف مفيد لهذه الاستراتيجيات في الإجابات.

كيفية قراءة وظائف رد الاتصال مرارا تحوم في مسج





html-input