سؤال

أقوم بتحميل صفحة مع load () ثم أقوم بإنشاء dinamally

بطاقة شعار. ثم أستخدم Live () لربط حدث نقرة وإطلاق وظيفة. في النهاية ، قم بتفريغ مكالمة ().

المشكلة هي أنه عندما أقوم بتحميل نفس الصفحة مرة أخرى (بدون تحديث) عند النقر فوق ، سيتم إطلاق الوظيفة مرتين. إذا خرجت مرة أخرى (مرة أخرى مع emlload ()) وقم بتحميل الصفحة مرة أخرى على النقر ، ستطلق النار 3 مرات وما إلى ذلك .... عينة من الكود الخاص بي هي:

$('#tab').click(function() {
 $('#formWrap').load('newPage.php');
});
$('div').after('<p class="ctr" ></p>');
$('p.ctr').live('click', function(e) {
   if($(e.target).is('[k=lf]')) { console.log ('one'); delete ($this); }
   else if ....
});
function delete () {
  $.post( 'update.php',  data);
}

لدي آخر $.post في الداخل في هذه الصفحة وأيضًا على FNC المباشر أعلاه وكل شيء يعمل بشكل جيد. كما أعلاه يعمل أيضًا ، لكن كما قلت في الحمل الثاني ، سيتم إطلاق النار مرتين و 3 مرات وما إلى ذلك ... الجزء الغريب بالنسبة لي هو أنه إذا راجع وحدة التحكم باستخدام console.log ('اثنان') ؛ احفظ الصفحة وتحميل الصفحة بدون تحديث ، ستطلق النار على صفوف مختلفة - اثنان -

إذا قمت بتفريغ الصفحة ، استبدل وحدة التحكم بـ Console.log ('Three') ؛ وتحميل مرة أخرى سوف تطلق اثنين وثلاثة. أحاول استخدام:

$.ajax({ url: 'updateDB.php', data: data, type: 'POST', cache:false });

$.ajaxSetup ({ cache: false });

header("Cache-Control: no-cache");

لا شيء من هذا يعمل. ولدي هذه المشكلة فقط على هذه FNC. ما رأيك ، يمكن أن يكون السبب ، أنه يتذكر أنه يتذكر الإجراء السابق ويطلق النار مرة أخرى؟

هل كانت مفيدة؟

المحلول 2

في الواقع الجواب ينتمي إلى @فيتور.

سأحاول فقط شرح ما كان يحدث بشكل أفضل:

ال live () كان FN داخل الصفحة التي كنت أقوم بتحميلها. وعلى الأول load () يعين FN Live المعالج للنقر. ولكن عند استخدام التفريغ ثم قم بإزالة جميع العناصر من تلك الصفحة ، يبقى الاتصال بين النقر والمعالجات.

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

الحيلة التي يجب استخدامها die () قبل unload (). ولكن هناك شيء آخر يجب مراعاته: لا يمكننا استخدام التسلسل مع live() ($('div').children().live() لن تعمل) وأيضًا على الرغم من:

$('.div .ctr').live() سيعمل.

مجرد الاتصال $('.ctr').die() لن يعمل.

لذلك عليك استخدام كل من FN نفس المحدد $('.ctr').live() وثم $('.ctr').die()

ربما هذا سوف يساعد شخص ما. وكذلك تحقق من 1.4.2 الجديد delegate () و undelegate ()

نصائح أخرى

أعتقد أنه قد يكون لديك خطأ مطبعي من خلال وجود ($ this) مقابل $ (هذا) ؛
لاحظ أيضًا أن هناك مشغل حذف في JavaScript ، لذا قد ترغب في تجربة اسم وظيفة آخر.
قد تعاني أيضًا من ذاكرة التخزين المؤقت في مكان ما (خوادم الويب بشكل افتراضي قم بتعيين ذاكرة التخزين المؤقت لملفات .js)

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