36

Potrzebuję przekazać dane między dwoma autonomicznymi użytkownikami - najlepiej bez dotykania obiektu unsafeWindow - i myślałem, że używanie niestandardowych zdarzeń będzie drogą do zrobienia. Myślałem o czymś takim (niech nam lekceważyć modelu MSIE dla celów przykładu):Czy istnieje sposób przekazywania dodatkowych danych przez zdarzenia niestandardowe?

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

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

Działa to dobrze w standardzie javascript środowiska iw ciągu jednej userscript, ale gdy zdarzenie jest zwolniony przez userscript i złapany poza nim lub wewnątrz innego userpada, właściwość data jest w chromium . Przypuszczam, że mogłem po prostu zapisać przekazane dane w sessionStorage, ale nie jest to łatwe. Jakieś inne eleganckie rozwiązania, panowie i uprzejmości? Potrzeba doskonałości i można ją osiągnąć, czuję to.

+0

'google-chrom-extension' znacznik lepiej pasuje niż' elegance'. Przyciągnie właściwą publiczność;) –

+0

dobre myślenie :) – Witiko

Odpowiedz

55

Tak, można użyć numeru MessageEvent lub CustomEvent.

Przykład użycia:

//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

Aby osiągnąć to za pomocą konstruktora 'new CustomEvent ('eventName'), należy przekazać dane w skrócie CustomEventInit, z kluczem" detail "w następujący sposób:' new CustomEvent ('eventName', {'detail': dane}); '. –

+6

wygląda tak, że 'initCustomEvent' jest przestarzałe – scrutari

+2

Czy te dane są serializowane? Czy mogę tam umieścić odniesienie do elementu HTML? –

6

przejście obiektu o więcej szczegółów co cech:

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

To nie jest JSON: {foo: "bar"} Jest to skrót JavaScript. JSON ma bardzo surowe reguły (klucze muszą być ujęte w podwójne cudzysłowy), a nawet jeśli ten sam JS byłby prawidłowy JSON, używanie go wewnątrz JS to tylko JS, a nie JSON. Moim zdaniem to tylko JSON, jeśli jest poprawny JSON i jest przechowywany jako ciąg. Kiedy jest to kod JS, jest to po prostu struktura JavaScript, która wygląda jak JSON. –

+0

Jakie są dokładne różnice między hasłami a obiektami Json? Z tego, co wiem, możemy utworzyć skrót taki jak var xyz = {}; xyz ['index1'] = "myvalue1"; xyz ['index2'] = "myvalue2"; –

+1

@SujalMandal - różnica polega na tym, że w ogóle nie używa poprawnie terminu JSON. To nie jest JSON, to tylko dosłowny obiekt javascript. JSON to ** string **, który służy do przesyłania danych między programami/danymi sklepu, a jego składnia jest silnie oparta na obiektach javascript. –

Powiązane problemy