سؤال

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

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

$('#myimage').click(function { return false; });
هل كانت مفيدة؟

المحلول

مسج ≥ 1.7

ومع مسج 1.7 فصاعدا تم تحديث API الحدث، .bind() / .unbind() لا تزال متاحة من أجل التوافق الى الوراء، ولكن الأسلوب المفضل هو استخدام في على () / قبالة () وظائف . أدناه سوف يكون الآن،

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

مسج <1.7

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

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

وبعد ذلك الحصول على النار كل الأحداث نقرة.

وكما قال الناس يمكنك استخدام إلغاء التوثيق لإزالة كافة الأحداث فوق:

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

إذا كنت ترغب في إضافة حدث واحد ومن ثم إزالته (دون إزالة أي أشخاص آخرين قد تم إضافة) ثم يمكنك استخدام مساحة الاسم الحدث:

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

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

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

نصائح أخرى

إذا كنت ترغب في الاستجابة للحدث مرة واحدة فقط, بناء الجملة التالي يجب أن تكون مفيدة حقا:

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

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

باستخدام الحجج.المستدعى, يمكننا التأكد من أن واحد محدد مجهول-وظيفة معالج إزالة وبالتالي يكون مرة واحدة معالج حدث معين.ويساعد هذا الأمل الآخرين.

وربما طريقة توثيق سيعمل لك

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

واضطررت الى تعيين الحدث فارغة باستخدام دعامة وATTR. أنا لا يمكن أن تفعل ذلك مع واحد أو آخر. أنا أيضا لم أستطع الحصول على .unbind للعمل. أنا أعمل على عنصر TD.

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

إذا تعلق الحدث على هذا الطريق ، أو والهدف هو أن يكون غير مرتبط:

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​

وأنت قد تكون إضافة معالج onclick كما الترميز المضمنة:

<input id="addreport" type="button" value="Add New Report" onclick="openAdd()" />

وإذا كان الأمر كذلك، فإن .off() مسج أو .unbind() لا تعمل. تحتاج إلى إضافة معالج الحدث الأصلي في مسج أيضا:

$("#addreport").on("click", "", function (e) {
   openAdd();
});

وثم مسج لديه إشارة إلى معالج الحدث، ويمكن حذفها:

$("#addreport").off("click")

وVoidKing يذكر هذا أكثر قليلا بشكل غير مباشر في تعليق أعلاه.

تحديث 2014

باستخدام أحدث نسخة من مسج, أنت الآن قادرة على توثيق جميع الأحداث على مساحة ببساطة عن طريق القيام $( "#foo" ).off( ".myNamespace" );

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

وشكرا على هذه المعلومات. مفيدة جدا ط استخدامه لتأمين التفاعل الصفحة أثناء وجوده في وضع التحرير من قبل مستخدم آخر. I استخدامها جنبا إلى جنب مع ajaxComplete. لا necesarily نفس السلوك ولكن تشبه إلى حد ما.

function userPageLock(){
    $("body").bind("ajaxComplete.lockpage", function(){
        $("body").unbind("ajaxComplete.lockpage");
        executePageLock();      
    });
};  

function executePageLock(){
    //do something
}

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

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

وكلا unbind() و.off() أساليب <م> لا الذهاب إلى العمل.

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

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

إلى 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 على ذلك.

حظا سعيدا...

هذا أيضا يعمل بشكل جيد .بسيطة وسهلة.انظر http://jsfiddle.net/uZc8w/570/

$('#myimage').removeAttr("click");

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

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

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

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

و
بلدي الحل:

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

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

وعلى أمل أن يساعد.

والأمل قانون بلدي أدناه يوضح كل شيء. HTML:

(function($){

     $("#btn_add").on("click",function(){
       $("#btn_click").on("click",added_handler);
       alert("Added new handler to button 1");
     });

  
 
     $("#btn_remove").on("click",function(){
       $("#btn_click").off("click",added_handler);
       alert("Removed new handler to button 1");
     });

  
   function fixed_handler(){
    alert("Fixed handler");
  }
  
   function added_handler(){
    alert("new handler");
  }
  
  $("#btn_click").on("click",fixed_handler);
  $("#btn_fixed").on("click",fixed_handler);
  
  
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn_click">Button 1</button>
  <button id="btn_add">Add Handler</button>
  <button id="btn_remove">Remove Handler</button>
  <button id="btn_fixed">Fixed Handler</button>

وأنا أعلم أن هذا يأتي في وقت متأخر، ولكن لماذا لا تستخدم عادي 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

إذا كنت تستخدم $(document).on() إضافة المستمع إلى عنصر إنشاؤه بشكل حيوي ثم قد تضطر إلى استخدام ما يلي إلى إزالته:

// add the listener
$(document).on('click','.element',function(){
    // stuff
});

// remove the listener
$(document).off("click", ".element");

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top