你可以派遣一个冒泡事件,并使用event.target
属性来获取节点的参考:
// content script
var myEventName = 'whatever' + Math.random(); // Unpredictable, avoid conflicts
document.addEventListener(myEventName, function(event) {
event.stopPropagation(); // No need to bubble further
var element = event.target;
// ... rest of your code
}, true); // <-- Get event at capture phase
// Inject the injected script
var script = document.createElement('script');
script.textContent = '(' + function(myEventName) {
function sendElementToContentScript(element) {
var event = new CustomEvent(myEventName, { bubbles: true });
element.dispatchEvent(event);
}
// ... rest of your code, e.g. sendElementToContentScript(document.body);
} + ')("' + myEventName + '");';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
如果你要传递更多的信息与事件,设置event.detail
属性:
// set
var event = new CustomEvent(myEventName, {
bubbles: true,
detail: 'any serializable type'
});
// read (in event listener
console.log(event.detail);
欲了解更多信息,请参阅CustomEvent
(MDN)和Building a Chrome Extension - Inject code in a page using a Content script(对于那些不熟悉脚本注入技术的人) 。
巧妙!它的工作原理,谢谢! – kriomant