JQuery 或 vanilla Javascript 中的 DOM Mutation 事件

2023-12-11

JQuery 或普通 Javascript 中是否存在触发跨浏览器的 DOM 突变事件?

为了澄清这一点,假设我的页面上有一个脚本,它将一个 div 插入到正文中。我无权访问该脚本,也不知道 div 何时被插入。我想知道是否有一个 DOM 突变事件,我可以为其添加侦听器,以了解何时插入元素。我知道我可以使用计时器定期检查插入情况,但是,我真的不喜欢这会带来的开销。


这当然是一种 hack,但为什么不修补用于插入节点的底层 DOM 方法呢?有几种方法可以做到这一点:

A。你知道吗specific元素将被附加到:

var c = document.getElementById('#container');
c.__appendChild = c.appendChild;
c.appendChild = function(){
     alert('new item added');
     c.__appendChild.apply(c, arguments); 
}

小提琴演示A

B。你知道吗type元素将被附加到:

HTMLDivElement.prototype.__appendChild = HTMLDivElement.prototype.appendChild;
HTMLDivElement.prototype.appendChild = function(){
    alert('new item added');
    HTMLDivElement.prototype.__appendChild(this,arguments); 
}

小提琴演示B

(注意解决方案B不支持IE < 8或任何其他不支持 DOM 原型的浏览器。)

同样的技术可以很容易地用于所有底层 DOM 突变函数,例如insertBefore, replaceChild or removeChild.

That's the general idea, these demos could be adapted for pretty much any other use case -- say you want to cast a wide net and catch all additions regardless of type AND make sure it works across all browsers everything but IE < 8? (see example C below)


UPDATE

C.递归地遍历 DOM,交换每个元素上的函数以触发回调,然后将相同的补丁应用于要附加的任何子元素。

var DOMwatcher = function(root, callback){
  var __appendChild = document.body.appendChild;

  var patch = function(node){
    if(typeof node.appendChild !== 'undefined' && node.nodeName !== '#text'){
      node.appendChild = function(incomingNode){
        callback(node, incomingNode);
        patch(incomingNode);
        walk(incomingNode);
        __appendChild.call(node, incomingNode);
      };
    }
    walk(node);  
  };

  var walk = function(node){
    var i = node.childNodes.length;
    while(i--){
      patch(node.childNodes[i]);
    }
  };

  patch(root);

};

DOMwatcher(document.body, function(targetElement, newElement){ 
   alert('append detected');    
});

$('#container ul li').first().append('<div><p>hi</p></div>');
$('#container ul li div p').append('<a href="#foo">bar</a>');

小提琴演示C

UPDATE 2

As Tim Down评论说,上述解决方案也不适用于IE < 8因为appendChild不是一个Function并且不支持call or apply。我想你总是可以回到笨重但值得信赖的地方setInterval方法如果typeof document.body.appendChild !== 'function'.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JQuery 或 vanilla Javascript 中的 DOM Mutation 事件 的相关文章

随机推荐

  • 有没有用 Java 实现的验证 HTML 解析器?

    我需要用 Java 解析 HTML 4 理想情况下 我想要一个与 SAX 兼容的实现 我知道 Java 有许多 HTML 解析器 但是 它们似乎都执行 整理 换句话说 它们将纠正格式错误的 HTML 我不想要这个 我的要求是 没有整理 如果
  • Flutter 键盘使文本字段隐藏

    我是新来的扑腾 我添加了一个带有文本字段的表单 当我单击文本字段并且键盘出现时 文本字段会上升 这是我的代码 Widget build BuildContext context MediaQueryData mediaQuery Media
  • 我想沿着特定路径制作对象的动画

    我必须移动路径上的小矩形 在画布内单击后 矩形会移动 我无法为其设置动画 因为对象只是跳转到所需的点 请在以下位置找到代码Fiddle HTML
  • InstallShield Basic MSI 卸载不显示带有“完成”按钮的对话框

    我使用 InstallShield 2018 并创建了一个 Basic MSI 项目 卸载产品时 它会确认我是否要继续卸载 确认后开始卸载 但随后它就消失了 最后没有显示一个对话框 您可以在其中单击 完成 按钮 因此 用户不知道卸载是否完成
  • 注册全局热键而不禁用其密钥

    我想制作一个程序 即使它在任何时候都不活动 也可以捕获键盘事件 Hooks 太复杂了 我需要做很多事情才能使其正常工作 制作 DLL 读取它等等 所以我决定继续使用热键 但现在我有一个问题 注册热键会禁用键盘上的按键 因此我只能将按键发送到
  • 为什么要使用指针? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我知道这是一个非常基本的问
  • 对大 O 表示法感到困惑

    根据这本书 大O的意思是 f n O g n means c g n is an upper bound on f n Thus there exists some constant c such that f n is always c
  • Windows Phone下如何获取设备方向改变事件

    对于 Windows Phone 当设备进入横向模式时 我是否可以注册一个事件 我之所以问这个问题是因为我们有一个带有输入框的视图 当处于横向模式时 TextBox部分被键盘阻挡 所以我想当页面处于横向模式时可能必须隐藏页面上的一些附加信息
  • Rails 中的 JQuery 在从另一个页面链接后失败,但在页面加载时工作

    我在主页上使用了一个报价旋转器 当我直接从浏览器加载页面 在浏览器中输入地址并按回车键 时 它工作正常 但是 如果我单击指向我网站中另一个页面的链接 然后链接回主页 它就会停止工作 更具体地说 引号开始重叠 几乎就像该方法的两个实例正在运行
  • ResolverStyle.STRICT 在“@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)”中不起作用

    我在用 DateTimeFormat iso DateTimeFormat ISO DATE JsonFormat pattern MM dd yyyy private LocalDate start 但它接受02 30 2019并转换为0
  • ado.net 使用“using”语句时关闭连接

    我正在像这样对 SQL Server 进行数据库访问方法 using SqlConnection con new SqlConnection connection string using SqlCommand cmd new SqlCom
  • 优化插入符的灵敏度似乎仍然可以优化 ROC

    我正在尝试使用插入符号来最大化我的模型选择的灵敏度rpart 为此 我尝试复制此处给出的方法 向下滚动到使用用户定义函数 FourStat 的示例 caret 的 github 页面 create own function so we ca
  • 如何创造漩涡/漩涡效果?

    我试图在作为传感器的圆形体上产生涡旋效果 我一直在寻找这个 我寻找的所有示例都是用 C 或 Objective C 编写的 但我似乎没有很好地翻译它们 当我的对象碰撞时 它调用 beginContact 并设置一个标志 以便我可以调用 bo
  • window.open(url, windowname, opts) 在新选项卡中打开,而不是在 Firefox 中打开新窗口

    似乎 尝试在jsfiddle window open http www google com window name width 400 height 320 完全停止在 Firefox 中打开新窗口 无论您输入什么内容作为 window
  • 针对客户和员工的 Spring Security 用户身份验证

    我是 Spring Security 的新手 我有一个带有两种不同类型实体的 Spring Boot 应用程序 客户和员工 在员工中 我有普通员工 管理员和超级用户 由于我使用的是 JPA 因此每个实体都有自己的repository 如何建
  • Oracle 数据访问组件 64 位无法在 IIS Express 7.5 中工作

    我已经安装了 ODAC Oracle 数据访问组件64 bit odp net 4 但不幸的是它不能与 IIs Express 一起使用 IIS Express文档说它支持32位和64位系统 它是否可以与 odp net 4 64 位 一起
  • 到底为什么我们需要 React.forwardRef ?

    假设我有一个带有可滚动子组件的组件 并且我想公开滚动的功能 const MyComponent props gt return
  • 2 个“样式”内联 css img 标签?

    我有以下标签 img src http img705 imageshack us img705 119 original120x75 png style width 100px alt 25 我已经将两个内联 CSS 命令放入 style
  • 如何通过命名空间获取属性的值

    我想获取属性的内容xsi 架构位置 它与 php 中的 getElementsByTagName 完美配合 以及之后的 foreach 但它很丑 对吗 如何通过简单的 Xpath 查询获得相同的内容 这是 xml 内容的简短示例
  • JQuery 或 vanilla Javascript 中的 DOM Mutation 事件

    JQuery 或普通 Javascript 中是否存在触发跨浏览器的 DOM 突变事件 为了澄清这一点 假设我的页面上有一个脚本 它将一个 div 插入到正文中 我无权访问该脚本 也不知道 div 何时被插入 我想知道是否有一个 DOM 突