通过manifest.json中的content_scripts注入到某页面的js文件,如下:
// create node for user interface
var new_node = document.createElement('div');
new_node.innerHTML = `
<button id="A" onclick="clickA()">a</button>
`;
// inject new node
var target_node = document.querySelector('...');
target_node.parentNode.insertBefore(new_node, target_node);
// functions
function clickA() {
alert('1');
}
按照以上写法,点击按钮a不能触发弹窗,chrome控制台提示clickA不存在。参考https://www.cnblogs.com/champagne/p/4844682.html,原因是
Content Scripts的执行位于一个特殊的环境,我们称为isolated world。在这个环境中,Content Scripts能够访问当前Web页面的DOM,但是Content Scripts与当前Web页面自带的JavaScript变量和函数是不能直接互相访问的。
也就是说,包含button的html代码片段注入到网页中后,与我们js文件的环境相隔离,无法调用到clickA函数了。以下是一种解决方式:
// create node for user interface
var new_node = document.createElement('div');
new_node.innerHTML = `
<button id="A">a</button>
`;
// inject new node
var target_node = document.querySelector('...');
target_node.parentNode.insertBefore(new_node, target_node);
// bind events
document.getElementById("A).onclick = () => {
alert('1');
};
关于这种方式,在https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html#injected-script的4.6 injected-script中有更详细的介绍。