1

我目前有以下greasemonkey脚本:

// ==UserScript==
// @name        test_script
// @namespace   my.example.com
// @include     http://example.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
// @version     1
// @grant       none
// ==/UserScript==

(function(window, undefined) {

        // normalized window
        var w;
        if (unsafeWindow != "undefined"){
                w = unsafeWindow
        } else {
                w = window;
        }

        // You can inject almost any javascript library here.
        // Just pass the w as the window reference,
        // e.g. jquery.min.js embedding:
        // (function(a,b){function ci(a) ... a.jQuery=a.$=d})(w);

        // do not run in frames
        if (w.self != w.top){
                return;
        }
        // additional url check.
        // Google Chrome do not treat @match as intended sometimes.
        if (/http:\/\/example.com\//.test(w.location.href)){
                var link = $('span.link').text();
                if (link) {
                    location.replace(link);
                }
        }
})(window);

打开example.com页面后,它会在此处查找 URL 并重定向我。它运行良好,但仅在加载所有图像、样式表等时才会发生重定向。我应该如何解决这个问题?看起来它应该发生在以前。

4

1 回答 1

2

显示的代码在加载图像之前触发,但不一定在 CSS 之前触发。
来自Mozilla 的 DOMContentLoaded 文档(并在 Gecko、Webkit 和 IE 中验证):

样式表加载块脚本执行,所以如果你有一个<script>after a <link rel="stylesheet" ...>,页面将不会完成解析 - 并且DOMContentLoaded 不会触发 - 直到加载样式表。

显然,如果 CSS 和/或图像很小或被缓存,它们也可能会在脚本触发之前加载。

也许可以使用@run-at document-start. 例如,请参阅此答案和类似内容。

于 2012-10-27T21:13:35.230 回答