Javascript 当元素直接通过其id而不是getElementById访问时,会出现扩展问题
尽管不推荐使用JavaScript,但JavaScript允许您通过元素的id访问元素,而无需使用getElementByIdJavascript 当元素直接通过其id而不是getElementById访问时,会出现扩展问题,javascript,google-chrome-extension,firefox-addon,Javascript,Google Chrome Extension,Firefox Addon,尽管不推荐使用JavaScript,但JavaScript允许您通过元素的id访问元素,而无需使用getElementById <iframe id="myframe" /> <script> var i = window.myframe; </script> var i=window.myframe; 这给需要在访问所述元素时访问这些元素的扩展带来了问题。实现这一点的方法是对getElementById的原型调用Object.definePro
<iframe id="myframe" />
<script>
var i = window.myframe;
</script>
var i=window.myframe;
这给需要在访问所述元素时访问这些元素的扩展带来了问题。实现这一点的方法是对getElementById的原型调用Object.defineProperty(),以便在调用它时,您可以访问该元素。但是当直接引用元素时,不会调用getElementById,因此,它们是扩展的盲点。我试过以下方法,但没有成功
- 在内容脚本中对DOM进行迭代似乎不起作用,因为尚未加载完整的DOM李>
- 设置“DOMContentLoaded”的侦听器不是一个选项,因为此时页面的脚本已经运行并可能访问元素
- 正在尝试在页面上的第一个脚本之前插入脚本,但再次尝试,此时实际上还不存在任何内容
<div id="foo"></div>
<script>
foo.textContent = 'foo';
</script>
<div id="bar"></div>
新突变观察者((突变)=>{
//检查是否插入了脚本
如果(每(
突变=>[…突变.添加节点].每(
addedNode=>addedNode.tagName!==“脚本”
)
)) {
//没有插入脚本
返回;
}
log(“正在运行的id重新分配”);
for(document.querySelectorAll(“[id]”)的常量){
Object.defineProperty(窗口,elm.id{
得到(){
log(“自定义代码运行”);
返回榆树;
},
可配置:true
});
}
})
.observe(document.body,{childList:true,subtree:true});
log('Lower脚本即将引用foo');
foo.textContent='foo';
log('Lower脚本已完成引用foo');
这样检索元素时,您想做什么?您想在返回元素之前运行自己的代码,还是想返回其他元素,或者根本不返回任何内容?这并没有任何帮助,但内部机制是根据HTML规范调用的。