在jQuery中使用$(document).ready的Greasemonkey问题

时间:2012-05-24 15:03:09

标签: jquery greasemonkey loading document-ready

当我访问www.reuters.com时,我无法弄清楚为什么这至少不会提醒我一次。我错过了什么吗?

// ==UserScript==
// @name        test3
// @namespace   test3
// @version     1
// ==/UserScript==

$(document).ready(function () {

    var actualHost = window.location.toString();
    var intendedHost = "www.reuters.com";

    alert("Debug 1 - " + actualHost);

    if (actualHost == intendedHost) {
        alert("Debug 2 - " + actualHost);
    }

});

谢谢。

2 个答案:

答案 0 :(得分:7)

  1. 为了使用jQuery,您必须加载jQuery。
  2. 默认情况下,大多数Greasemonkey脚本中不需要
  3. $(document).ready()Greasemonkey fires at the appropriate time
  4. 因此最简单的脚本版本变为:

    // ==UserScript==
    // @name     test3
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
    // @grant    GM_addStyle
    // ==/UserScript==
    //- The @grant directive is needed to restore the proper sandbox.
    
    var actualHost = window.location.toString();
    var intendedHost = "www.reuters.com";
    
    alert("Debug 1 - " + actualHost);
    
    if (actualHost == intendedHost) {
        alert("Debug 2 - " + actualHost);
    }
    

    注意:

    1. 尽可能使用@require(几乎总是如此)。

      1. @require会在本地计算机上放置脚本的副本,因此您的脚本运行速度更快,并且每次运行都不依赖于外部服务器。
      2. @require维护沙箱安全/分离,因此您的脚本可以免受来自目标页面的副作用或攻击
      3. 即使你已经禁用了所有目标网页的javascript,
      4. @require也会让您的脚本正常运行 - 这是一种非常有价值的技术。
      5. 如果您使用优秀的Tampermonkey extension。,则
      6. @require甚至是Chrome的端口



        添加jQuery的其他复杂方法存在多个问题:

        1. 他们是不必要的Security risk
        2. 它们使您的脚本不必要地依赖于每次运行的外部服务器
        3. 他们减慢你的脚本速度。
        4. 他们使用GM的优秀功能like GM_xmlhttpRequest() and GM_setValue(),不可能或更困难。
        5. 他们将你的脚本绑定到目标页面JS执行的变幻莫测。

        6. 始终为您的脚本提供适当的@include, @exclude, and/or @match directives,以便它只能在所需的页面上运行。

        7. 考虑使用console.log()代替alert()。它对调试的干扰要小得多。

答案 1 :(得分:1)

不起作用是一个非常糟糕的问题描述..

无论如何,我在这里看到一个问题。试试这个:

// ==UserScript==
// @name        test3
// @namespace   test3
// @version     1
// @include     *reuters.com*
// ==/UserScript==

loadDependancies(function () {

    var actualHost = unsafeWindow.location.toString();
    var intendedHost = "www.reuters.com";

    alert("Debug 1 - " + actualHost);


    if (actualHost == intendedHost) {
        alert("Debug 2 - " + actualHost);
    }


});

您需要使用@include指令告诉GM应该运行脚本的位置。 您应该使用unsafeWindow来访问该页面的窗口对象

如果页面上还没有jquery,你还需要加载jquery:

DEBUG = true

function addScript(url){
    var s = document.createElement('script');
    s.src = url;
    s.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(s);
}

function log(msg){
  if(DEBUG){
    unsafeWindow.console && unsafeWindow.console.log(msg);
  }
}

function loadDependancies(boostrapFn) {

  addScript('jquery CDN url goes here..');

  var check = function(){
    log("waiting for dependancies to load: "+ typeof unsafeWindow.jQuery);
    if(typeof unsafeWindow.jQuery == 'undefined'){
      window.setTimeout(check, 500);
    }    else {
      jQuery = $ = unsafeWindow.jQuery;
      boostrapFn();
    }
  }
  check();
}

这就是你的新剧本。它会加载jquery供你使用