当前位置: 首页 > 面试题库 >

Chrome扩展程序在发生Ajax请求时运行代码

傅阳炎
2023-03-14
问题内容

因此,对我的问题进行基本描述。

我有一个现在可以正常使用的扩展程序(最终),可以将电话号码包装在一种标签中。

它现在正在运行,但是我遇到了基于用户动作或基于ajax请求通过JS动态加载的任何内容的问题

例如,如果我单击并发送一个Hotmail电子邮件,该脚本将起作用,但仅当我刷新页面时,该电子邮件才能加载并调用我的内容脚本。

我考虑过通过使用户单击扩展程序的图标来解决此问题,但这并不是要求的功能。

如果Chrome中有一种方法可以监听ajax请求(似乎有
这种方法)http://code.google.com/chrome/extensions/webRequest.html这是我想要做的,但是我不确定如何实现这一点。我可以将它当作听众吗?

我根据DOM的更改时间找到了另一种方法,但是这使得加载需要很长时间,因此DOM中有太多的事情要做。我需要监听AJAX请求,并在它们完成后再次运行我的代码。

任何帮助,甚至正确方向的指针都将很棒=)

如果这是一个愚蠢的问题,请很好,我保证我一直在Google搜索和搜索表单中寻找答案,但似乎找不到任何东西。我可能不甚了解,甚至无法提出正确的问题。我已经使用JavaScript大约两个星期了,所以我的学习曲线一直很艰难。


问题答案:

当你说…

我根据DOM的更改时间找到了另一种方法,但是这使得加载需要很长时间,因此DOM中有太多的事情要做。我需要监听AJAX请求,并在它们完成后再次运行我的代码。

…您在哪里使用突变事件或突变观察者?因为我认为观察员应该在哪里解决该问题。我以前从未对Observers做过任何事情,并使用过Mutation
Summary
。它似乎能够完成您想要的事情,只是它直到文件准备就绪/空闲(不确定哪个)才开始观察,因此您可能必须对文件准备就绪进行扫描,然后解雇观察员。
这是我的测试代码(在内容脚本中)的样子……

handleChanges = function(summaries) {
    // There may be more things to ignore
    var ignore = {
        SCRIPT: true,
        NOSCRIPT: true, 
        CDATA: true,
        '#comment': true
    }
    summaries.forEach(function(summary) {
        summary.added.forEach(function(node) {
            if (!ignore[node.nodeName] || (node.parentNode && !ignore[node.parentNode.nodeName]) && node.nodeValue.trim()) {
                node.nodeValue='PAEz woz ere - '+node.nodeValue;
            }
        })
    })

}

var observer = new MutationSummary({
    callback: handleChanges,
    // required
    rootNode: document,
    // optional, defaults to window.document
    observeOwnChanges: false,
    // optional, defaults to false
    queries: [{
        characterData: true
    }]
});

检查XMLHttpRequest的另一种方法是劫持它,它看起来就像(在文档开始时的内容脚本中一样).....

function injectScript(source) {

    var elem = document.createElement("script"); //Create a new script element
    elem.type = "text/javascript"; //It's javascript
    elem.innerHTML = source; //Assign the source
    document.documentElement.appendChild(elem); //Inject it into the DOM
}

injectScript("("+(function() {

    function bindResponse(request, response) {
        request.__defineGetter__("responseText", function() {
            console.warn('Something tried to get the responseText');
            console.debug(response);
            return response;
        })
    }

    function processResponse(request,caller,method,path) {
        bindResponse(request, request.responseText);
    }

    var proxied = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function(method, path, async) {
            var caller = arguments.callee.caller;
            this.addEventListener('readystatechange', function() {
                if (this.readyState === 4)
                    processResponse(this,caller,method,path);
            }, true);
        return proxied.apply(this, [].slice.call(arguments));
    };
}).toString()+")()");

…我在超级棒的Supper Happy Fun Blog中学不到。
但是,正如您现在可能知道的那样,这对于ajax驱动的站点来说还不够。通常,您必须为网站编写一些特定的内容,否则Mutation
Observer可能会满足您的需求。



 类似资料:
  • 问题内容: 我有一个chrome扩展程序,可以在网站上进行一些更改(编辑评论)。 在站点上进行了最近更改之后(站点不是我的站点)-使用ajax加载了注释块(之前是简单的发布请求,整个页面都重新加载了)。 现在,如果我第一次加载页面-内容脚本可以工作,但是当我转到下一页时,说页面#2-使用ajax添加注释,并且不再运行扩展脚本。所以评论并没有改变我想要的方式。 有没有简单的方法来监听页面更改DOM并

  • 问题内容: 我知道如何在Selenium Webdriver中加载Chrome扩展程序。但是我没有看到任何描述如何从Selenium 运行 chrome扩展的帖子/博客。 我需要明确地使chrome扩展程序运行/使其从selenium中执行其功能。例如,我想使用带有Selenium Webdriver的扩展程序清除Chrome浏览器的缓存。 我可以先做吗?还是Selenium WebDriver仅

  • 我知道如何在selenium webdriver中加载chrome扩展。但是我没有看到任何描述如何从Selenium运行chrome扩展的帖子/博客。< br> 我需要明确地让chrome扩展运行/让它从selenium执行它的功能。比如我想用Selenium Webdriver的这个扩展清除Chrome浏览器的缓存。< br> 我可以先做吗?或者Selenium WebDriver是否只帮助我将

  • 本文向大家介绍原生Ajax请求代码?相关面试题,主要包含被问及原生Ajax请求代码?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Ajax能够在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容,实现局部刷新,大大降低了资源的浪费,是一门用于快速创建动态网页的技术,ajax的使用分为四部分: 1、创建XMLHttpRequest对象var xhr = new XMLHttpRe

  • 问题内容: 所以对于这个项目,我试图在运行时扩展一个类。我想知道,这有可能吗?如果是这样,我该怎么办?是否有用于这些目的的库? 问题答案: CGLib是您要查找的库。它在扩展类或在运行时实现接口方面非常强大,因此许多流行的框架(如Spring或Hibernate)都使用它。 您可以使用以下代码创建类扩展 尽管您可能会使用具有所需逻辑的有用的方法拦截器替换回调。

  • 问题内容: 我的Chrome扩展程序有小问题。 我只想从另一台服务器获取JSON数组。但是清单2不允许我这样做。我尝试指定,但是JSON数组存储在没有SSL证书的服务器上。 那么,不使用清单1怎么办? 问题答案: 该CSP不能引起你所描述的问题。您很有可能使用的是JSONP而不是纯JSON。JSONP在Chrome中不起作用,因为JSONP通过在文档中插入标签而起作用,该标签的属性设置为Web服务