Javascript 我可以制作一个元素吗;“不可取消”;通过重新定义本机函数从DOM中删除?

Javascript 我可以制作一个元素吗;“不可取消”;通过重新定义本机函数从DOM中删除?,javascript,html,dom,redefinition,Javascript,Html,Dom,Redefinition,假设我有以下结构: <html> <head></head> <body> <div id="myDiv"></div> </body> </html> 对于其他功能,我也可以这样做,例如: querySelector querySelectorAll getElementsByTagName getElementsByClassName 等等 这是可行的,但是通

假设我有以下结构:

<html>
   <head></head>
   <body>
       <div id="myDiv"></div>
   </body>
</html>
对于其他功能,我也可以这样做,例如:

  • querySelector
  • querySelectorAll
  • getElementsByTagName
  • getElementsByClassName
  • 等等
这是可行的,但是通过调用以下命令,div仍然可用:

document.body.children[0]

那么有没有一种方法可以使我的div不可编译,也就是说,我可以重新定义
children
字段的值吗?

好吧,这似乎是一种可行的尝试-至少对于
document.body.children
。我在MDN的网站上测试了以下代码的一个变体,以隐藏作为文档正文直接子项的所有脚本标记

其工作方式是告诉
document.body
使用名为
children
的新属性。然后,我们返回
子对象的原始内容,减去我们不想要的内容

var oldchildren = document.body.children;
Object.defineProperty(document.body, 'children', { 
    get() { 
        var lst = [];
        for (var item of oldchildren) {
            if (!(item.tagName === "div" && item.id === 'myDiv'))
                lst.push(item);
        }
        return lst;
    } 
});

在此代码运行后,任何引用
document.body.children
的代码都不会看到
div
。此代码可能会导致您网站上的其他代码行为不当。

您为什么要这样做?不完全是您的意思,但是。。。。。。您可以将其从DOM中删除。找不到不存在的东西!我正在尝试破解一个大学项目的代码,想知道这种方式是否可行。很遗憾,我无法删除元素。我不想就此得出明确结论,但如果浏览器能够找到要显示的元素,那么任何人都可以。所以如果你不能从DOM中删除它,那么任何人都可以在DOM中访问它。谢谢大家。我想让元素以任何方式(不仅仅是id)都不可编译。我认为我必须覆盖您描述的所有字段(children、firstChild、lastChild等)以及所有搜索函数(querySelector、getElementById等)。我将尝试这种方法(感谢Amy的回答),但我对代理方法也感兴趣@帕特里克·罗伯茨。再次感谢!最好将
lst
定义为
Object.create(HTMLCollection)
,但当然,当我测试时,会尝试迭代,或者简单地检查
length
访问器属性抛出
TypeError
,所以。。。我想这没关系
var oldchildren = document.body.children;
Object.defineProperty(document.body, 'children', { 
    get() { 
        var lst = [];
        for (var item of oldchildren) {
            if (!(item.tagName === "div" && item.id === 'myDiv'))
                lst.push(item);
        }
        return lst;
    } 
});