سؤال

دعنا نقول أن لدي سيناريو حيث لدي برنامج إضافي عالمي (أو على الأقل ملحق يرتبط بمجموعة أوسع من الأحداث).

يأخذ هذا البرنامج المساعد محددا، وينقذ بنقرة حية لذلك. شيء في مسج الزائفة التي قد تبدو مثل هذا:

$.fn.changeSomething = function(){
     $(this).live("change", function(){ alert("yo");});
}

في صفحة أخرى، لدي رزمة حية إضافية مثل هذا:

$("input[type='checkbox']").live("click", function(){alert("ho");});

ضمن هذا السيناريو، فإن مربع الاختيار ينتهي بكثارة إلى حد ما إلى كل من الأحداث الحية.

ما أراه هو أن تغيير الحدث التغيير كما ينبغي، وأنا نبهت "يو". ومع ذلك، باستخدام الحدث المباشر هذا، لا أشغلها أبدا. ومع ذلك، باستخدام نقر مرافق، أقوم بالضغط عليه.

الحل السهل هو تشغيل حدث انقر في نهاية معالج التغيير الحي، ولكن هذا يبدو جانك لي. أيه أفكار؟

لاحظ أن هذا يستخدم JQuery 1.4.2 ويحدث فقط في IE8 (من المفترض 6/7 أيضا، لكنني لم أختبرها).

مثال (ستحتاج إلى JQuery-1.4.2.min.js):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $.fn.changeSomething = function(){
        var t = $(this);
        t.live("change", function(){
            alert("yo");
        }); 
    };

    $(document).ready(function(){
    $("input[type='checkbox']").changeSomething();
    $("#special").live("click", function(){
      alert("ho");
    });
    });
</script>
</head>
<body>
<form>
  <input type="checkbox" id="cbx" />
  <input type="checkbox" id="special" />
  </form>
</body>
</html>
هل كانت مفيدة؟

المحلول

أنت تعرف أن IE لن يطلق الحدث "تغيير" حتى يفقد مربع الاختيار التركيز، أليس كذلك؟

تعديل بينما أعتقد أن هذا صحيح، فإن التأثير من تلك الصفحة الاختبار أمر غريب جدا. ما زلت ألعب معها. إن آلية "Live" تربطني ويجعلني عصبي بعض الشيء، رغم أنني أفهم قيمتها تماما.

لقد وضعت صفحة اختبار (تعديل قليلا وتوضيح) http://gutfullofbeer.net/clicks.html. وسأبدأ في القيام ببعض تصحيح الأخطاء المسج

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

$('body').bind('change', function() { return true; });

ثم تبدأ الأمور في العمل بشكل طبيعي. أنا متأكد من أن alex هو الصحيح، أن هناك شيء يحدث مع الطريقة التي تحاول jQuery مزيفة فقم الحدث "التغيير". لا يزال مخيف ولكن. صفحة الاختبار في http://gutfullofbeer.net/clicks-body.html. ويمكنك أن ترى الغرابة بالنقر فوق "الإعداد مع تغيير المعالج أولا" أولا "، ثم انقر فوق خانات الاختيار ولاحظ أن المعالج" انقر فوق "في الحرائق الوحيدة الثانية مرة واحدة، ثم انقر فوق" ربط معالج إلى الجسم "ومشاهدة كيف تتصرف خانات الاختيار بعد ذلك.

نصائح أخرى

جرب استخدام $.delegate مع سلف مشترك بدلا من $.live

المفتاح لتذكر مع live هو أن الحدث هو ليس ملزمة بالعنصر الذي تحدده. لا بد أن document ثم بمجرد ظهور فقاعات الأحداث إلى المستند، فهو يتحقق من المحدد الذي مرته في هدف الحدث.

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

يمكنك استعمال ال JQuery.livequery Plugin.

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top