jQuery - sahifadagi har bir element uchun jonli hodisani faqat bir marta tetiklasa bo'ladimi?

Mana senariy

$("p").live('customEvent', function (event, chkSomething){ 
//this particular custom event works with live
    if(chkSomething){
        doStuff();
       //BUT only per element
       //So almost like a .one(), but on an elemental basis, and .live()?
    }
})

Bu erda ba'zi fon bor

The custom event is from a plugin called inview

The actual issue is here http://syndex.me

  1. Qisqacha aytganda, yangi tumblr postlari infnitely orqali aylantirilmoqda JavaScript-ni o'chirish (faqatgina u erda tumblr fyi uchun).
  2. Inview plaginida yangi xabarlar ko'rinishdagi ko'rinishga kiradi, vahiyning yuqori qismi ko'rsatilsa, uni ko'rinadigan qiladi.
  3. Bu juda oz ishlaydi, lekin konsolingizni http: //.syndex.me yordamida tekshiring, voqea ishdan chiqarildi
  4. Ehtimol, men ham notinchlik qilyapman va bu yaxshi emasmi? Iltimos, menga o'zingizning fikringizni bildiring. lekin ideal holda men endi kerak bo'lmagan narsalarni qilishni to'xtatishni xohlayman.

Men ishlamagan ba'zi narsalar:

  1. to'xtatishPropagation

  2. .die ();

  3. S.O. orqali ba'zi echimlar. yoki ishlamadi, masalan, jQuery'da, faqat bitta marta bosishning bir usuli bormi? yoki bilan .one() dan foydalaning. Jonli() jQuery

Nima uchun bunday imkoniyat hali ham mavjud emasligi bilan ajablanaman. Albatta, .one() hodisasi ham kelajakdagi elementlar uchun ham kerakmi? #justsayin

Rahmat.

1

3 javoblar

Voqealar sodir bo'lganda elementga sinf qo'shing va faqat o'sha sinfga ega bo'lmagan elementlarda voqea yuz beradi.

$("p:not(.nolive)").live(event,function(){
  $(this).addClass("nolive");
  dostuff();
});

O'zgartirish: sharhlardan olingan misol:

$("p").live(event,function(){
  var $this = $(this);
  if ($this.data("live")) {
    return;
  }
  $this.data("live",true);
  doStuff();
});
2
qo'shib qo'ydi
Katta fikr Kevin; albatta funktsional :) CSS obyektlari yordamida ma'lumot ob'ektidan foydalanyapman. Men faqatgina "nolive" (agar bu holatda) uslublar jadvalida yakunlangan bo'lsa, bizni muammoga duchor qiladigan CSS deklaratsiyalarini yoqtirmayman. Fikrlash uchun ovqat.
qo'shib qo'ydi muallif Kato, manba
To'g'ri, haqiqiy ... dasturlash hamma narsadan farq qilmaydi, shunday emasmi? :)
qo'shib qo'ydi muallif Kato, manba
Buning uchun $ = = (bu) uchun nima kerak?
qo'shib qo'ydi muallif RGBK, manba
Uch maslahat uchun rahmat. Bu erda √ tanlash qiyin, ular hamma yaxshi. Men bu ikkita variantni tanladim. To'g'ri savolni tuzish uchun so'nggi 24 soat ichida men yaratgan qancha dov-postlar haqida hech qanday tasavvurga ega emassiz. Barchangizga minnatdorman.
qo'shib qo'ydi muallif RGBK, manba
Ma'lumotlar obyektini ishlatish bilan bog'liq yagona masala - bu oddiy tanlov yordamida filtrlana olmaydi. Agar sizda bor bo'lsa o'xshash ifodalarga ega bo'lasiz. Misol keltiraman.
qo'shib qo'ydi muallif Kevin B, manba
Biz $ (this) dan bir necha martadan foydalanganimiz sababli, zarur bo'lgan ishlovni qisqartirish uchun uni keshlashdi. Bu talab qilinmaydi va bu holatda farq qilmaydi, bu har safar men bir xil tanlovdan bir martadan ko'proq foydalanganim uchun ishlatiladigan narsadir.
qo'shib qo'ydi muallif Kevin B, manba

Bu ish (qarang: fiddle ):

jQuery(function($) {
    $("p").live('customEvent', function(event, chkSomething) {
        //this particular custom event works with live
        if (chkSomething) {
            doStuff();
           //BUT only per element
           //So almost like a .one(), but on an elemental basis, and .live()?
            $(this).bind('customEvent', false);
        }
    });

    function doStuff() {
        window.alert('ran dostuff');
    };

    $('#content').append('
Here is a test

'); $('p').trigger('customEvent', {one: true}); $('p').trigger('customEvent', {one: true}); $('p').trigger('customEvent', {one: true}); });

Bu sizning ehtiyojlaringiz uchun ham ishlashi kerak, garchi bu juda yaxshi emas :)

$("p").live('customEvent', function (event, chkSomething){ 
    //this particular custom event works with live
    if(chkSomething && $(this).data('customEventRanAlready') != 1){
        doStuff();
       //BUT only per element
       //So almost like a .one(), but on an elemental basis, and .live()?
        $(this).data('customEventRanAlready', 1);
    }
})
1
qo'shib qo'ydi

Kevin aytganidek, buni CSS tanlovchilarini qo'llash orqali bajarishingiz mumkin, lekin aslida : not() dan foydalanish shart emas. Bu muqobil usul:

// Use an attribute selector like so. This will only select elements
// that have 'theImage' as their ONLY class. Adding another class to them
// will effectively disable the repeating calls from live()
$('div[class=theImage]').live('inview',function(event, visible, visiblePartX, visiblePartY) {
   if (visiblePartY=="top") {
      $(this).animate({ opacity: 1 });
      $(this).addClass('nolive');
      console.log("look just how many times this is firing")
   }
});

Saytdagi haqiqiy kodni ishlatardim. Umid qilamanki.

1
qo'shib qo'ydi