2012-03-27 13 views
6

Ho un breve script scritto che funziona bene su Chrome:jQuery/Javascript - event.target.id su Firefox

function updateSentence(){ 
    $(document).ready(function() { 
     t = event.target.id; 
     $("#S"+t).html($("#"+t).val()); 
    }); 
} 

Tuttavia, nel caso in Firefox non è definito. Ho trovato alcune domande simili che suggerivano che evento deve essere passato come parametro alla funzione:

function updateSentence(event){ 
    $(document).ready(function(event) { 
     t = event.target.id; 
     $("#S"+t).html($("#"+t).val()); 
    }); 
} 

Eppure, per me questa soluzione non risolve il problema di Firefox, e si rompe in realtà come funziona in Chrome. In Chrome, si finisce per dire che event.target non è definito quando questi vengono passati.

Cosa sto sbagliando?

Dopo aver ricevuto alcuni commenti mi sono reso conto che il modo in cui stavo pensando a jQuery in generale era sbagliato. Non volevo che $(document).ready chiamasse ogni aggiornamento della frase. Ripulire la funzione con questa conoscenza ho finito con:

function updateSentence(){ 
    t = event.target.id; 
    $("#S"+t).html($("#"+t).val()); 
} 

Questo ancora aggiorna correttamente la frase in Chrome, ma target continua ad essere non definito in Firefox. Cosa potrei aver bisogno di fare per farlo funzionare in Firefox? E sto ancora facendo qualcosa di fondamentalmente sbagliato in jQuery?

Inoltre, per rispondere a una domanda nei commenti, l'evento che sto cercando è l'evento onchange che ha attivato updateSentence(). Questo dovrebbe essere chiamato quando un campo di selezione/testo viene cambiato.

(sto ancora nuovo per jQuery e JavaScript in generale, e sono sicuro che sto solo facendo un semplice errore.)


ho trovato la mia risposta. Pubblicherò tra un paio d'ore quando il sito me lo permetterà.

+2

Cosa ti aspetti che l'obiettivo sia? '$ (document) .ready' invia jQuery stesso come argomento - non c'è un elemento di destinazione. – pimvdb

+2

Non penso che eseguire (document) .ready all'interno di un'altra funzione sia una buona idea. Dovrebbe essere eseguito una volta, a pagina 'pronto'. Se chiamato dopo quell'evento, non funzionerà come tu vuoi. – lifeIsGood

+3

L'uso di "tuttavia in Firefox" suggerisce che, in qualche altro browser, si ottiene un risultato da qualche parte. Davvero non dovresti esserlo. Non con quella sceneggiatura. –

risposta

2

Sì, molto buono. Se ripensi a come l'hai fatto, ha più senso. Separa la tua rilegatura dalla tua funzione e quella è metà della battaglia con quello che stai facendo.

$(function() { // Equivalent of Document Ready; You only need this once; 
    // BINDINGS HERE 
    $('someSelector').on('change keypress', function(event) { 
    updateSentence(this); 
    }); 
}); 

function updateSentence(elem) { 
    $('#S' + elem.id).html(elem.value) ; 
} 

E inoltre, questo è uno di quei casi che suggerirei di non utilizzare nemmeno una funzione secondaria.In alcuni casi, ciò che si vuole fare è abbastanza semplice da rendere difficile giustificare una funzione da chiamare diversa da quella che si fa sul binding.

$(function() { 
    $('someSelector').on('change keypress', function(event) { 
    $('#S' + this.id).html(this.value) ; 
    }); 
}); 

Si noterà in entrambi i casi la necessità di event è ovviato. Tuttavia, è disponibile, anche per FF, in quanto verrà passato come argomento n (function(event)).

Il motivo per cui il "bersaglio" non è definito nel codice per FF è perché FF non afferra lo event in aria come la maggior parte dei browser. Pertanto, se non è possibile impostare il codice per eliminare la necessità dello event o passarlo come nei miei esempi, è possibile fare riferimento ad esso tramite window.event.

1

Dopo aver preso in considerazione ciò che è stato menzionato nei commenti precedenti e aver letto ciò che stavo facendo un po 'di più, ho trovato la risposta alla mia domanda. Innanzitutto, stavo erroneamente usando una chiamata $(document).ready ogni volta che veniva chiamata la funzione. Successivamente, la mia comprensione di come l'ID è stato passato alla funzione sembra essere errata. Sembra che non sia passato automaticamente, ma deve invece essere fatto manualmente. Quindi, la mia iniziale confusione sul motivo per cui gli altri commentatori sono stati confusi dalla mia domanda. In ogni caso, conoscendo queste cose, ho trovato la mia risposta in una combinazione di altre due domande con risposta. Essi possono essere trovati in queste due domande Stack Overflow:

Sono sicuro che sto ancora dicendo qualcosa che non va in questa spiegazione, ma io Impareremo di più a breve.

+0

No, non sembri davvero vedere come si propaga l'evento. L'evento bolle, ha proprietà e uno di questi è l'obiettivo. L'obiettivo può avere un ID (non può essere impostato/indirizzabile). Ma l'obiettivo è da dove i problemi di evento. Pertanto, target.id è dove potresti trovare l'id dell'elemento. Ma non ti stai appropriando correttamente dell'evento con la tua domanda (vedi la mia risposta con come: puoi ignorare la necessità di fare riferimento all'evento o b: se vuoi davvero ottenere l'id tramite il target tramite l'evento, quindi passare il evento attraverso così FF lo vede direttamente O accede all'evento tramite window.event – williambq

Problemi correlati