如何在注入脚本时等到嵌入式ajax调用完成?

时间:2012-08-31 10:26:42

标签: ajax jquery google-chrome-extension

这是Google Chrome扩展程序开发。我正在使用内容脚本注入网页。但是,有些网页有自己的ajax脚本,可以动态更改内容。我如何等到这些脚本完成,因为在完成之前我的脚本无法获得正确的内容?

例如,

1-在Google搜索结果页面上

2-我希望将“text”附加到每个搜索结果项的标题上,这可以通过调用轻松完成,

$('h3').append("text");

3-然后听取

完成的搜索查询更改
$('input[name="q"]').change( function(eventObj){
    console.log("query changed");
    // DOESN'T work
    $('h3').append("text");
});

最后一行不起作用可能因为当它执行时页面仍然刷新,$('h3')不可用。当页面上的查询发生变化时,Google会使用ajax刷新搜索结果。

所以问题是如何捕获此更改并且仍然能够每次成功附加“text”?

修改

尝试过但都没有工作:

$('h3[class="r"]').delay(1000).append("text");

使用.delay()并不是首选。

修改

.delay()根本不是为解决暂停执行除UI效果之外的脚本而设计的。解决方法是

$('input[name="q"]').change(function(eventObj) {    
    setTimeout(function() {
      $('h3[class="r"]').append(" text");
    }, 1000);
});

但正如我之前所说,setTimeout()依赖于连接速度,不是首选,因为我必须手动平衡等待时间和响应速度(我的脚本)。

虽然这篇文章因为上帝知道而被拒绝投票 - 为什么我仍然会等待一个优雅的答案。

1 个答案:

答案 0 :(得分:1)

可能使用jQuery 1.7+(或旧版本使用“live”或“delegate”)

$('form').on( "change", 'input[name="q"]', function(eventObj){
    console.log("query changed");
    $('h3').append("text");
});

如果form是另一个元素,请相应更改。