Ancora una volta voglio caricare una pagina che contiene il proprio script in un div utilizzando $ ("divid"). Load (...). Il problema che affronto è legato agli eventi. Diciamo che attiviamo ("scimmia") dalla pagina madre e sulla pagina caricata leghiamo ("scimmia") e facciamo solo un avviso ("vincolato alla scimmia"). Se lo stesso metodo di caricamento viene chiamato più volte, il binding viene chiamato più volte. Ora potrei semplicemente smembrarlo prima di legarlo, o controllare il numero di handler prima del binding e poi non legarlo per impedirlo. Nessuna delle due opzioni è scalabile come se in seguito desiderassi associare a quel trigger in un'altra "sottopagina" (una pagina caricata in un div).Modello eventi JQuery e prevenzione di gestori duplicati
Quello che voglio idealmente fare è controllare se il gestore che sto per aggiungere esiste già, ma voglio ancora usare gestori anonimi ... (chiedendo un po 'più di quell'ultima richiesta che penso). Attualmente ho una soluzione alternativa usando i metodi predefiniti/denominati e quindi controllando questo prima del bind.
// Found this on StackOverflow
function getFunctionName(fn)
{
var rgx = /^function\s+([^\(\s]+)/
var matches = rgx.exec(fn.toString());
return matches ? matches[1] : "(anonymous)"
}
function HandlerExists(triggerName, handlerName) {
exists = false;
if ($(document).data('events') !== undefined) {
var event = $(document).data('events')[triggerName];
if(event !== undefined)
{
$.each(event, function(i, handler) {
alert(handlerName);
if (getFunctionName(handler) == handlerName) {
exists = true;
}
});
}
}
return exists;
}
Questo è un modo piuttosto crudo di andare avanti mi sembra, ma sembra funzionare. Faccio quanto segue prima del bind come segue:
if (!HandlerExists("test", "theMethod")) {
$(document).bind("test", theMethod);
}
Qualcuno ha una soluzione più elegante? per esempio, c'è un modo per controllare che uno script particolare sia caricato? quindi potrei usare getScript() per caricare il js dalla pagina figlio al primo caricamento, e poi semplicemente non caricarlo sui carichi successivi (e lanciare un trigger che sarebbe gestito da lui preesistente js) ..
possibile duplicato del [jquery funzione di prevenzione di duplicato assegnato] (http://stackoverflow.com/questions/1558377/jquery-prevent-duplicate-function-assigned) –