【问题标题】:Chrome extension run content script on ajax changeChrome 扩展在 ajax 更改上运行内容脚本
【发布时间】:2012-06-20 12:56:25
【问题描述】:

我有一个 chrome 扩展程序,它在网站上进行了一些更改(编辑 cmets)。

在网站最近发生更改后(网站不是我的) - 评论块使用 ajax 加载(之前是简单的发布请求并重新加载整个页面)。

现在,如果我第一次加载页面 - 内容脚本可以工作,但是当我转到下一页时,比如第 2 页 - 使用 ajax 添加 cmets 并且不再运行扩展脚本。所以 cmets 并没有按照我想要的方式改变。

有什么简单的方法可以监听页面变化 DOM 并再次应用扩展脚本?

在我的清单文件中:

{
  "name": "Name",
  "version": "1.0",
  "description": "Description",
  "icons": {"16":"16.png",
            "48":"48.png",
            "32":"32.png",
            "128":"128.png"},
  "browser_action": {
    "default_title": "Default title",
    "default_icon": "48.png",
    "popup": "popup.html"
  },
  "permissions": [
    "tabs",
    "http://www.site.com/*",
    "notifications",
    "unlimitedStorage"
  ],

  "options_page": "options.html",
  "background_page": "background.html",

  "content_scripts": [
                {
                    "matches": ["http://www.site.com/*","https://www.site.com/*"],
                    "js": ["jquery-1.7.1.min.js","content.js"],
                    "run_at": "document_end"
                }]
}

【问题讨论】:

    标签: ajax google-chrome google-chrome-extension


    【解决方案1】:

    您可以在名为DOMSubtreeModified 的事件上添加一个侦听器。给它绑定一个函数,只要有变化就会调用它。

    在 jQuery 中:

    $('#ContentContainer').bind('DOMSubtreeModified',modifyComments);
    

    更新:

    如果事件多次触发,请在第一次删除事件绑定,等到一定超时后,可以调用 modifyComments 重新绑定事件。

    function DOMModificationHandler(){
        $(this).unbind('DOMSubtreeModified.event1');
        setTimeout(function(){
            modifyComments();
            $('#ContentContainer').bind('DOMSubtreeModified.event1',DOMModificationHandler);
        },1000);
    }
    
    //after document-load
    $('#ContentContainer').bind('DOMSubtreeModified.event1',DOMModificationHandler);
    

    【讨论】:

    • .event1 后缀是什么?
    • 哦,在我从我的另一个脚本中粘贴代码之前,我忘了删除 event namespacing 的东西..
    • 我使用了 $("#ContentContainer").bind('DOMSubtreeModified',function(){ alert('changed'); });并且它在一次加载期间触发“更改”太多次 - 似乎所有子元素都是一个一个添加并且每次都会触发事件 - 如果我运行脚本来编辑 cmets 那么多 - 这不是浪费资源的好方法。有没有办法检查元素在这个过程中是否发生了变化?
    • 正是这个逻辑与 setTimeout 和递归绑定取消绑定我试图在您的第一次响应后自己编写代码,但您的解决方案运行良好。谢谢。
    • 谢谢!这确实帮助我解决了一个独特的问题。
    猜你喜欢
    • 2015-12-24
    • 2023-03-19
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2013-10-21
    • 2011-09-28
    相关资源
    最近更新 更多