Domanda

Diciamo che ho uno scenario in cui ho un plugin globale (o almeno un plugin che si lega a una gamma più ampia di eventi).

Questo plugin richiede un selettore, e si lega un live click ad esso. Qualcosa nella pseudo-jquery che potrebbe essere simile a questo:

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

In un'altra pagina, ho un ulteriore qualcosa di vivo legame simile a questo:

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

In questo scenario, la casella di controllo idealmente finiscono per essere legati a entrambi gli eventi dal vivo.

Quello che sto vedendo è che gli incendi cambiamento evento come si deve, e sto avvisato "yo". Tuttavia, utilizzando questo evento click dal vivo, non ho mai innescare. Tuttavia, utilizzando un esplicito click vincolante, FACCIO colpirlo.

La soluzione semplice è quello di innescare un evento click alla fine del gestore cambiamento dal vivo, ma questo sembra janky a me. Qualche idea?

Si noti che questo sta usando jQuery 1.4.2 e si verifica solo in IE8 (I supposto 6/7 sarebbe troppo, ma io non li ho ancora testato).

un esempio (avrete bisogno 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>
È stato utile?

Soluzione

Si sa che IE non verrà generato l'evento "cambiamento" fino a quando la casella di controllo perde lo stato attivo, giusto?

modifica , mentre io penso che sia vero, l'effetto da tale pagina di prova è piuttosto bizzarro. Sto ancora giocare con esso. Il meccanismo di "live" mi confonde e mi fa un po 'nervoso, anche se capire a fondo il suo valore.

Ho messo la pagina di prova (leggermente modificato e chiarito) fino: http://gutfullofbeer.net/clicks .html e ho intenzione di iniziare a fare qualche debug jQuery

zona crepuscolare: Come notato nei commenti, quando mi legano un manichino "cambiamento" gestore per l'elemento del corpo:

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

poi le cose iniziano a lavorare normalmente. Sono sicuro che @alex è giusto, che ci sia qualcosa da fare con il modo in jQuery sta tentando di falsificare il gorgogliare della manifestazione "cambiamento". Ancora spettrale però. La pagina di prova è a http://gutfullofbeer.net/clicks-body.html e si può vedere la stranezza cliccando sul "Setup con gestore cambiamento prima", quindi fare clic sulle caselle di controllo e notare che il "click" del gestore sul secondo solo fuochi volta, quindi fare clic sul "associa un gestore per il corpo" e vedere come le caselle di controllo comportarsi dopo.

Altri suggerimenti

Provare a usare $.delegate con un antenato comune, invece di $.live

La chiave da ricordare con live è che l'evento è non Certamente l'elemento selezionato. E 'destinato a document e poi una volta l'evento bolle al documento, si confronta con il selettore avete passato sul target dell'evento.

La chiave per imparare da questo è che in IE - l'evento di modifica non fa naturalmente bolla, come nella maggior parte dei browser. In IE L'evento "bolle" basati su un'euristica che funziona allo stesso modo in tutti i test di jQuery come l'evento reale in altri browser. C'è probabilmente qualcosa nella tua altra funzione che sta arrestando questa euristica da lavorare. Quindi ha senso che si tratta di IE specifico. Non che questa è una buona cosa ...

È possibile utilizzare il jquery.livequery plug

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top