如何更改ajax驱动页面中的所有链接?

时间:2013-10-15 08:04:46

标签: javascript ajax google-chrome userscripts tampermonkey

我有一个用户修改了IP直接Google搜索页面上所有适用链接的href:

// ==UserScript==
// @name     _Modify select Google search links
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @include  http://62.0.54.118/*
// ==/UserScript==

var qLinks  = document.querySelectorAll ("a[href*='?q=']");

for (var J = qLinks.length - 1;  J >= 0;  --J) {
    var oldHref = qLinks[J].getAttribute ('href');
    var newHref = oldHref.replace (/\?q=/, "?&q=");

    //console.log (oldHref + "\n" + newHref);
    qLinks[J].setAttribute ('href', newHref);
}


它在第一页上工作正常,但是当我使用分页链接时,它会停止工作 - 因为新页面是由AJAX加载的。

@Brock Adams告诉我使用waitForKeyElements(),但我无法弄明白该怎么做。

我看过一些主题,例如stackoverflow.com/questions/10888326/executing-javascript-script-after-ajax-loaded-a-page-doesnt-work,但我无法弄清楚如何使用它们。

如何使用该脚本更改AJAX页面上的链接,如:

http://62.0.54.118/search?&q=42&oq=42&sourceid=chrome&ie=UTF-8&filter=0#filter=0&q=42&start=10

1 个答案:

答案 0 :(得分:1)

要更改静态页面代码以使用waitForKeyElements(),您可以执行3到4个简单任务:

  1. 在脚本的元数据部分中包含jQuery和waitForKeyElements。
  2. 为waitForKeyElements选择适当的jQuery选择器。它通常与您用于querySelectorAll()的内容相同。
  3. 为单个节点调整任何循环驱动的代码。适当地利用jQuery。
  4. 在这种情况下,Google会在您分页时覆盖链接,而不是使用AJAX来放置新的链接。所以让回调函数返回true
  5. 根据问题代码将所有内容整合在一起,完整脚本

    // ==UserScript==
    // @name     _Modify select Google search links
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // @include  http://62.0.54.118/*
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
    // @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
    // @grant    GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a design change
        introduced in GM 1.0.   It restores the sandbox.
    */
    waitForKeyElements ("a[href*='?q=']", changeLinkQuery);
    
    function changeLinkQuery (jNode) {
        var oldHref = jNode.attr ('href');
        var newHref = oldHref.replace (/\?q=/, "?&q=");
    
        jNode.attr ('href', newHref);
    
        return true;
    }