2012-05-24 130 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

相關問題