Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当元素直接通过其id而不是getElementById访问时,会出现扩展问题_Javascript_Google Chrome Extension_Firefox Addon - Fatal编程技术网

Javascript 当元素直接通过其id而不是getElementById访问时,会出现扩展问题

Javascript 当元素直接通过其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

尽管不推荐使用JavaScript,但JavaScript允许您通过元素的id访问元素,而无需使用getElementById

<iframe id="myframe" />
<script>
    var i = window.myframe;
</script>

var i=window.myframe;
这给需要在访问所述元素时访问这些元素的扩展带来了问题。实现这一点的方法是对getElementById的原型调用Object.defineProperty(),以便在调用它时,您可以访问该元素。但是当直接引用元素时,不会调用getElementById,因此,它们是扩展的盲点。我试过以下方法,但没有成功

  • 在内容脚本中对DOM进行迭代似乎不起作用,因为尚未加载完整的DOM
  • 设置“DOMContentLoaded”的侦听器不是一个选项,因为此时页面的脚本已经运行并可能访问元素
  • 正在尝试在页面上的第一个脚本之前插入脚本,但再次尝试,此时实际上还不存在任何内容
有人知道JavaScript在这样引用元素时使用的内部机制吗?我很好奇是否有另一个函数可以像getElementById一样在内部调用。或者有没有办法确保内容脚本代码在DOM加载之后但在页面脚本运行之前运行

或者有没有办法确保内容脚本代码在DOM加载之后但在页面脚本运行之前运行

一个问题是,页面脚本可以在DOM完全加载之前运行。例如,如下所示:

<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规范调用的。