2012-05-24 104 views
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); 
    } 

}); 

谢谢。

回答

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为你使用

+0

谢谢您的参与。我的意思是没有警报触发,我不明白为什么。 – derek8

+0

你忘记了include指令。看看任何其他工作GM脚本 – mkoryak

+0

嗯,仍然没有提醒我。 – derek8

6
  1. 为了使用jQuery,你必须加载jQuery。
  2. $(document).ready()默认情况下在大多数Greasemonkey脚本中不需要为Greasemonkey fires at the appropriate time

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

// ==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连接到Chrome的端口,如果你使用优秀的Tampermonkey extension



    其他的,令人费解,添加jQuery方法有多种问题:

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


  2. 总是给你的脚本适当@include, @exclude, and/or @match directives,这样只会所需的网页上运行。

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

+1

很棒的信息,谢谢 – derek8

相关问题