2013-01-14 11 views
6

Se si dà un'occhiata a this fiddle in Chrome e si fa clic il testo di trigger con la console js apre vedrete questo:Perché utilizzare Chrome `with` per gli eventi in linea

enter image description here

Qual è la ragione di tutti quei blocchi with e qual è il suo valore?

+0

Questo è il modo in cui gli eventi in linea dovrebbero funzionare. – SLaks

+1

@SLaks Qual è il valore di 'this [2]', 'this [1]' e 'this [0]' allora? – MosheK

+0

@SLaks sai se questo comportamento è scritto ovunque, o è solo roba per mantenere gli script del 1997 in esecuzione nei browser moderni? Dumping tutte le proprietà dall'elemento target e il documento nello scope sembra un po '... strano. – Pointy

risposta

6

Mi sembra come se il browser crea una funzione per il gestore eventi quando viene specificato come attributo HTML "onclick". Io penso cosa che fa è:

  • fanno una funzione di gestore di eventi con un unico parametro per l'oggetto evento e il codice fornito;
  • crea le proprietà dell'elemento (il tag <a>), un oggetto vuoto (?) E l'oggetto documento sembra essere simboli disponibili per il codice in quella funzione.

Cioè, this[0] è l'elemento <a> stessa, this[1] sembra un'istanza Object vuoto, e this[2] è l'oggetto del documento. Ciò significa che nel codice che scrivi come parte di un attributo di gestore eventi "onfoo" (e non in qualsiasi gestore di eventi ordinario legato da codice JavaScript diretto), è possibile fare riferimento alle proprietà dell'elemento di destinazione (il elemento per il quale si sta impostando l'attributo) e le proprietà dell'elemento del documento come se fossero presenti nella catena dell'ambito.

Se si modifica il codice un po ':

$('<a href=# onclick="console.log(baseURI);"> ... 

Quindi si ottiene il valore del "baseURI" proprietà dell'elemento <a>. Non è necessario prefisso "baseURI" con qualsiasi cosa che si riferisce esplicitamente al nodo DOM per l'elemento <a>; è solo "lì" come se fosse stato dichiarato con var in un ambito che racchiude.

(controllo specifiche del W3C ora ...) modificare — non ho trovato nulla che stabilisce quali simboli dovrebbero essere a disposizione del codice di script in gestori di eventi. Questo è veramente strano

modificare nuovamente — Firefox sembra fare la stessa cosa, anche se non vedo le esplicite dichiarazioni with ovunque.

+0

C'è qualche possibilità che le istruzioni 'with' siano un artefatto di correre nella console? Sappiamo che le console introducono altrimenti inutili dichiarazioni "eval", e posso immaginare che questo potrebbe essere un meccanismo simile, anche se non ho davvero pensato esattamente al ** perché **.:-) –

+2

@ScottSauyet bene, non so esattamente da dove provengano le dichiarazioni 'with'. La parte che mi fa impazzire è l'effetto ** ** delle istruzioni 'with', e che è un comportamento che fa anche Firefox. – Pointy

+1

È un comportamento standard (sfortunatamente). http://jibbering.com/faq/names/event_handler.html, http://www.w3.org/TR/html5/webappapis.html#internal-raw-uncompiled-handler – Bergi

1

with sposta l'argomento sopra lo stack di ambito. Quindi è persino superiore all'oggetto globale, ai parametri della funzione, ecc. Non capisco perché lo usano. Forse è un codice generato.

Problemi correlati