1

我无法弄清楚为什么当我访问 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);
    }

});

谢谢你。

4

2 回答 2

7
  1. 为了使用 jQuery,您必须加载 jQuery。
  2. $(document).ready()在大多数 Greasemonkey 脚本中不需要,因为Greasemonkey默认会在适当的时间触发。

所以最简单的脚本版本变成:

// ==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. @require即使您禁用了所有目标页面的 javascript,也可以让您的脚本正常运行——这是一项非常有价值的技术。
    4. @require如果您使用出色的Tampermonkey 扩展,甚至可以移植到 Chrome 。



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

    1. 它们是不必要的安全风险
    2. 它们使您的脚本在每次运行时都不必要地依赖外部服务器!
    3. 他们会减慢您的脚本速度。
    4. 它们使使用 GM 的出色功能(如 GM_xmlhttpRequest() 和 GM_setValue() )变得不可能或更加困难。
    5. 它们将您的脚本与目标页面的 JS 执行的变幻莫测联系在一起。


  2. 始终为您的脚本提供适当@include@exclude、、和/或@match指令,以便它只在所需的页面上运行。

  3. 考虑使用console.log()而不是alert(). 它对调试的干扰要小得多。

于 2012-05-24T21:52:34.223 回答
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,您还需要加载它:

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 供您使用

于 2012-05-24T15:05:50.320 回答