有没有办法通过自定义事件传递其他数据?

Wit*_*iko 57 javascript dom userscripts google-chrome-extension dom-events

我需要在两个自主用户脚本之间传递数据 - 理想情况下不接触unsafeWindow对象 - 我认为使用自定义事件将是最佳选择.我想到了这样的事情(让我们为了示例的目的忽略MSIE模型):

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

var custom = document.createEvent("HTMLEvents");
custom.initEvent("customEvent", true, true);
custom.data = "Some data...";
dispatchEvent(custom);
Run Code Online (Sandbox Code Playgroud)

这在标准的javascript环境中和一个用户脚本中很好地工作,但是当事件被用户脚本触发并被捕获到它之外或在另一个用户脚本中时,data属性是undefined铬.我想我可以保存传递的数据sessionStorage,但它远非无缝.还有其他优雅的解决方案,绅士和女士们?完美需要并且可以实现,我能感受到它.

Dig*_*ane 87

是的,你可以使用a MessageEvent或a CustomEvent.

用法示例:

//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);
Run Code Online (Sandbox Code Playgroud)

  • 要使用`new CustomEvent('eventName')`构造函数实现这一点,请在CustomEventInit哈希中传递数据,用'detail'键入,如下所示:`new CustomEvent('eventName',{'detail':data});` . (25认同)
  • +1也可以使用`CustomEvent`.请注意,您应该使用`detail`属性,只有在侦听器中的`event.detail`下才能使用它. (3认同)
  • 我的数据序列化了吗?我可以在那里引用HTML元素吗? (2认同)

Ami*_*t G 9

传递具有更多细节的对象作为属性:

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

function eventHandler(e) {
  log('detail1: ' + e.detail.detail1);
  log('detail2: ' + e.detail.detail2);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是JSON:{foo:"bar"}这是一个JavaScript哈希.JSON有非常严格的规则(键必须用双引号括起来),即使相同的JS是有效的JSON,在JS中使用它只是JS而不是JSON.在我看来,它只是JSON,如果它是有效的JSON并且它存储为字符串.当它是JS代码时,它只是一个看起来像JSON的JavaScript数据结构. (9认同)
  • 为了使它起作用,需要在名为`detail`的属性中包装`'detail1':“ something”,detail2:“ somethingother”`:`var event = new CustomEvent('build',{detail:{'detail1 ':“ something”,detail2:“ something”]});` (3认同)
  • @SujalMandal - 不同之处在于他根本没有正确使用术语 JSON。那不是 JSON,这只是一个 javascript 对象文字。JSON 是一种**字符串**格式,用于在程序之间传输数据/存储数据,其语法很大程度上基于 javascript 对象。 (2认同)

Geo*_*ond 6

new CustomEventIE 不支持https://caniuse.com/#search=CustomEvent

这是一个也适用于 IE9+ 的版本:

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

 //Dispatch an event
 var evt = document.createEvent('CustomEvent');
 evt.initCustomEvent('MyEventType', false, false, { test: "Any Object Here" });
 window.dispatchEvent(evt);
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案已被弃用。支持 IE9+ 的一种更面向未来的方法是使用 polyfill。另请参阅 https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/initCustomEvent (4认同)