2014-07-14 30 views
-3

我目前正在编写一个非常简单的Google Chrome浏览器扩展程序,它利用内容脚本,通过抓取元素并在页面完成加载时附加到其网页上,将其他文本简单地添加到网页上。加载后立即修改页面元素

问题是,我正在修改的网页在媒体上很丰富,需要几秒钟才能加载,因此导致其他文本在加载文本的其余部分后几秒钟才显示。

我抓的元素是span。有没有什么方法可以监听这个元素,以便我可以尽快修改它?

+0

见[清单](https://developer.chrome.com/extensions/content_scripts),特别'run_at',即 “run_at”: “document_start” – Xotic750

+0

@ Xotic750在“document_idle”或“document_end”中运行会产生我在OP中描述的效果。在“document_start”处运行结果不起作用,因为要修改的页面元素尚不存在。 – DannyF247

+0

@ DannyF247看到这个[规范问题](http://stackoverflow.com/questions/2844565/is-there-a-jquery-dom-change-listener)。在开始时注入,倾听改变。 – Xan

回答

1

正如在评论中指出,在“document_start”使用manifest设定注入你的内容脚本“run_at”

然后用MutationObserverdocument听要添加它。

的Javascript

new MutationObserver(function (mutations) { 
    mutations.some(function (mutation) { 
     console.log(mutation); 
     if (mutation.type === 'childList') { 
      return Array.prototype.some.call(mutation.addedNodes, function (addedNode) { 
       if (addedNode.id === 'added') { 
        mutation.target.textContent = 'Added text'; 
        return true; 
       } 

       return false; 
      }); 
     } 

     return false; 
    }); 
}).observe(document, { 
    attributes: false, 
    attributeOldValue: false, 
    characterData: false, 
    characterDataOldValue: false, 
    childList: true, 
    subtree: true 
}); 

document.addEventListener('DOMContentLoaded', function onDOMContentLoaded() { 
    var div = document.createElement('div'); 

    div.id = 'added' 
    document.body.appendChild(div); 
    console.log('Added a div'); 
}, true); 

jsFiddle

+0

'document.body' does not not ** yet exists at'document_start'。如果我没有记错的话,就是'document.documentElement'。 – Xan

+0

(我不是OP的顺便)等待'DOMContentLoaded'等同于运行在'document_end',这正是OP不需要的。您的代码很好,除了您通过“观察”调用附加的元素之外。 – Xan

+0

只需将'MutationObserver'添加到'document'。 – Xotic750

相关问题