javascript - 我可以通过重新定义 native 函数从 DOM 中创建一个元素 "unfindable"吗?

标签 javascript html dom redefinition

假设我有以下结构:

<html>
   <head></head>
   <body>
       <div id="myDiv"></div>
   </body>
</html>

通过重新定义一些原生 JavaScript 函数,我可以让 myDiv 无法找到吗?

例如,我可以这样做:

window.HTMLDocument.prototype.getElementById = (function() {
  var oldefinition = window.HTMLDocument.prototype.getElementById;

  return function() {
    var returnValue = oldefinition.apply(this, arguments);
    if (returnValue && returnValue.id === 'myDiv') {
      return oldefinition.call(this, 'blablabla');
    } else {
      return returnValue;
    }
  }
})();

我可以对其他功能做同样的事情,例如:

  • querySelector
  • querySelectorAll
  • getElementsByTagName
  • getElementsByClassName
  • 等等

这有效,但 div 仍然可以通过调用:

document.body.children[0]

那有没有办法让我的div无法找到,也就是我可以重新定义children字段的值吗?

最佳答案

好吧,这个尝试似乎还不错 - 至少对于 document.body.children 来说是这样。我在 MDN 的网站上测试了以下代码的变体,以隐藏文档正文的所有直接子脚本标记。

它的工作方式是我们告诉 document.body 使用一个名为 children 的新属性。然后我们返回 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。此代码可能会导致您网站上的其他代码出现异常。

关于javascript - 我可以通过重新定义 native 函数从 DOM 中创建一个元素 "unfindable"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529973/

相关文章:

javascript - 调用函数时如何取消绘制矩形

javascript - 向表单添加多个字段

javascript - 选择复选框、单选按钮和列表

Javascript — 转义字符实体(→ 显示为 →)

php - 清除选择或操作 POST 值

javascript - 在 javascript 的 console.log 中将变量乘以数字

javascript - 字段数组的 JQuery 不显眼验证 - 仅连接到第一个字段?

javascript - 如何在 javascript/css 中实现标签栏

javascript - 使用 JavaScript 在 HTML 中动态创建 anchor 标记

dom - 在浏览器中调试自定义 DOM 事件