1

www.reuters.comにアクセスしたときに、なぜこれが少なくとも1回は警告されないのか理解できません。私は何かが足りないのですか?

// ==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_xmlhttpRequest()やGM_setValue()のようなGMの優れた関数を使用することを不可能にするか、はるかに困難にします。
    5. 彼らはあなたのスクリプトをターゲットページのJS実行の気まぐれに結び付けます。


  2. スクリプトに適切な、、および/またはディレクティブを常に指定@include@exclude@match目的のページでのみ実行されるようにします。

  3. console.log()の代わりに使用することを検討してくださいalert()。デバッグの邪魔になりません。

于 2012-05-24T21:52:34.223 に答える
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がページにまだ存在しない場合は、ロードする必要があります。

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 に答える