我正在编写Chrome扩展程序/用户脚本,以便为第三方网站添加一些可用性。扩展所针对的页面包含一些元素,这些元素通过addEventListener附加了click
个事件侦听器(每个元素,没有冒泡)(onclick
和其他属性为空)。我的扩展克隆(cloneNode
)其中一个元素并将其附加到列表中。
例如,
<div id="list">
<div id="d1">A</div>
<div id="d2">B</div>
<div id="d3">C</div>
</div>
我的扩展程序会添加一个D元素。
扩展列表工作正常,但是当单击原始节点时,它们会执行预期的操作,而单击新节点则不会执行任何操作。
我检查了Chrome开发者工具中元素的事件监听器,并尝试使用addEventListener
将匿名函数复制到我的新元素(确保复制参数),但这不起作用。它确实执行了一些预期的操作,但不是全部。
我尝试了anfilat建议使用来自this question的技巧。我插入一个script
块,然后为新节点调用addEventHanlder
,它确实有新的处理程序(sourceName
引用网站 - 而不是.JS
1}}文件 - 而不是扩展名),但它仍然抛出一个未找到的变量错误。
我怀疑这是一个域问题,因为点击处理程序调用外部.JS
中的函数,如下面的事件监听器的sourceName
和lineNumber
所引用。请注意,listenerBody
是相同的,但来源不同。
有没有办法访问,复制或克隆元素的处理程序和/或编辑lineNumber
和sourceName
?
图1 :原始元素的处理程序引用网站上的.JS
(带有轻微的文件名编辑):
图2 :引用扩展名的新元素的处理程序:
答案 0 :(得分:1)
我写了小工作测试。
Chrome扩展程序注入脚本:
var myScriptElement = document.createElement('script');
myScriptElement.innerHTML =
'b=document.getElementById("button");' +
'c=b.cloneNode(true);' +
'b.parentElement.appendChild(c);' +
'c.addEventListener("click", function(e){foo("from new button")}, false);';
document.querySelector('head').appendChild(myScriptElement);
测试html:
<html>
<script type='text/javascript' src='test.js'></script>
<body>
<button id='button'>test</button>
<script>
document.getElementById('button').addEventListener('click', function (event) {
foo('from page');
}, false);
</script>
</body>
</html>
和test.js:
function foo(text) {
console.log(text);
};