2

重複の可能性:
Greasemonkey 1.0のjQueryは、jQueryを使用しているWebサイトと競合します

私のgreasemonkeyスクリプトのいずれかに以下のような行がある場合、jqueryを含むサイトでエラーが発生するようです。理由はわかりませんが、JavaScriptイベントがまったく発生しないことに気づきました。(たとえば、SOではコメントを追加できません)。

スクリプトでSOを除外することはできますが、より良い解決策はありますか?たぶん、jqueryが存在するかどうかをテストした後、動的にjqueryを追加する必要があります。この問題を解決するにはどうすればよいですか?また、jqueryを使用せずにjqueryスクリプトタグを本文に追加するにはどうすればよいですか?

// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
4

2 に答える 2

4

Greasemonkey 1.0は、サンドボックスの動作方法を根本的に変え、何千ものスクリプトを破壊しました。また、Greasemonkey 1.0のjQueryは、jQueryを使用するWebサイトと競合します

これは大きな問題であり、Greasemonkeyのリード開発者は、賢明な方法でそれを解決することを完全に望んでいないことを表明しました。

これを回避するには、メタデータブロックを編集して次の行で終了すること$により、サンドボックスをスクリプトに復元し、競合を解決します。

// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a major design change introduced in GM 1.0,
    It restores the sandbox.
*/


@grant値(以外) を指定するとnone、サンドボックスが再度アクティブになります。


また、過去に優れた機能とパフォーマンスを提供し、この新しいサンドボックスの動作に悩まされていないScriptishへの切り替えを検討することもできます。

Scriptishは、これまでのところ、インストールベースの大部分を破壊する更新を投稿していません。

于 2012-10-19T22:45:29.523 に答える
2

jQueryがまだ含まれていない場合にのみ、jQueryを含める必要があります。したがって、最初の行をチェックする必要があります。含まれている場合はスクリプトを実行し、含まれていない場合は同様の行を追加して含めてから、チェック関数をループします。このようなもの:

var wrote = false,
    runScript = function(){
    if(typeof(jQuery) === 'undefined'){
        if(!wrote){
            wrote = true;
            document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>');
        }
        setTimeout(runScript, 50);
    }else{
        //your script goes here
    }
};

runScript();

唯一の問題は、グーグルのjqueryが起動していないかどうかです。

于 2012-10-19T22:30:17.483 に答える