36

ho bisogno di passare dati tra due userscripts autonomici - idealmente w/o toccare l'oggetto unsafeWindow - e ho pensato con eventi personalizzati sarebbe la strada da percorrere. Ho pensato a qualcosa di simile (fateci trascuriamo il modello MSIE a scopo di esempio):Esiste un modo per trasmettere dati aggiuntivi tramite eventi personalizzati?

addEventListener("customEvent", function(e) { 
    alert(e.data); 
}); 

var custom = document.createEvent("HTMLEvents"); 
custom.initEvent("customEvent", true, true); 
custom.data = "Some data..."; 
dispatchEvent(custom); 

Questo funziona bene nello standard javascript ambiente ed entro un userscript, ma quando l'evento viene generato dal userscript e rimasta fuori o dentro un'altra userscript, la proprietà data è undefined in cromo. Suppongo che potrei semplicemente salvare i dati passati nel sessionStorage, ma è tutt'altro che senza soluzione di continuità. Altre soluzioni eleganti, signori e gentiluomini? La perfezione ha bisogno e può essere raggiunta, posso sentirla.

+0

Il tag 'google-chrome-extension' si adatta meglio di' elegance'. Essa attirerà il pubblico giusto;) –

+0

pensare bene :) – Witiko

risposta

55

Sì, è possibile utilizzare un MessageEvent o un CustomEvent.

Esempio utilizzo:

//Listen for the event 
window.addEventListener("MyEventType", function(evt) { 
    alert(evt.detail); 
}, false); 

//Dispatch an event 
var evt = new CustomEvent("MyEventType", {detail: "Any Object Here"}); 
window.dispatchEvent(evt); 
+21

per raggiungere questo obiettivo utilizzando la 'nuova CustomEvent ('eventName')' costruttore, passare i dati in un hash CustomEventInit, digitato da 'dettaglio' in questo modo: 'nuova CustomEvent ('eventName', {'detail': data}); '. –

+6

assomiglia 'initCustomEvent' è deprecato – scrutari

+2

I s che i dati serializzati? Posso inserire un riferimento a un elemento HTML? –

6

oggetto passaggio con maggiori dettagli come attributi:

var event = new CustomEvent('build', { 'detail1': "something", detail2: "something else" }); 

function eventHandler(e) { 
    log('detail1: ' + e.detail.detail1); 
    log('detail2: ' + e.detail.detail2); 
} 

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

+9

Questo non è JSON: {foo: "bar"} È un hash JavaScript. JSON ha regole molto rigide (le chiavi devono essere racchiuse tra virgolette doppie) e anche quando lo stesso JS sarebbe JSON valido, utilizzarlo all'interno di JS è solo JS e non JSON. Secondo me è solo JSON se è JSON valido e viene memorizzato come una stringa. Quando si tratta di codice JS, è solo una infrastruttura JavaScript che sembra essere JSON. –

+0

Quali sono le differenze esatte tra hash e oggetti Json? Per quanto ne so possiamo fare un hash come var xyz = {}; xyz ['index1'] = "myvalue1"; xyz ['index2'] = "myvalue2"; –

+1

@SujalMandal - la differenza è che non sta usando il termine JSON correttamente. Quello non è JSON, è solo un oggetto letterale javascript. JSON è un formato ** ** stringa che viene utilizzato per trasferire dati tra programmi/dati di archivio e la sua sintassi è fortemente basata su oggetti javascript. –

Problemi correlati