7

ここに私のスクリプトコードがあります:

    // ==UserScript==
    // @name          test 
    // @description   test
    // @include       http://*
    // @copyright     Bruno Tyndall
    // ==/UserScript==

    var main = function() {
        var b = document.getElementsByTagName('body')[0];
        var t = document.createElement('div');
        t.innerHTML = '<a href="javascript:void(0);" style="color:white;">Hello World</a>';
        t.style.position = 'absolute';
        t.style.zIndex = 1000;
        t.style.bottom = '5px';
        t.style.right = '5px';
        t.firstChild.setAttribute('onclick', 'test();');
        b.appendChild(t);

    }

    var test = function() {
        alert("Hello World");
    }
    main();

私が抱えている唯一の問題は、Hello World をクリックすると、ページで test() 関数が見つからないことです。このようにページに関数をinnerHTML'ingすることで解決する必要はないことを教えてください。別の方法はありますか?

ありがとう。

4

3 に答える 3

14

Greasemonkey はサンドボックスでスクリプトを実行します。セキュリティ上の理由から、ページはサンドボックスにアクセスできません。dom とウィンドウへのすべてのアクセスはラッパー経由です。

セキュリティで保護されていないオブジェクトにアクセスする場合は、wrappedJSObjectプロパティを使用できます。

あなたのケースでは、unsafeWindow(またはwindow.wrappedJSObject)を使用できます:

unsafeWindow.test = function() { ....

これにはいくつかのセキュリティ上の問題があります。http ://wiki.greasespot.net/UnsafeWindow を参照してください。

また、グリースモンキーは DOMContentLoaded (dom の準備ができたとき) イベントの後にスクリプトを実行するので、オンロードのナンセンスは必要ありません。

また、属性を使用してイベント リスナーやプロパティを設定することはできません。そのためには dom api を使用する必要があります。例えば:

t.firstChild.addEventListener('click', test, false);

また:

t.firstChild.addEventListener('click', function(event){ blabla }, false);
于 2009-02-15T17:17:10.867 に答える
2

iirc では、グリースモンキーは独自のスコープ内で実行されるため、test はグローバル名前空間にはなりません。

ただし、グローバルを汚染する代わりに、DOM 操作によってアンカー要素を作成してみませんか? これにより、無名関数 (またはグリースモンキー スコープのテスト) をバインドできる参照が返されます。

于 2009-02-15T15:33:18.450 に答える
1

関数テストを window オブジェクトに追加してみてください

window.test = function ...

編集

また、スクリプトの最後で単に呼び出すのではなく、'load' イベント ハンドラーからコードを実行することをお勧めします。例えば:

window.addEventListener("load", function(e) {
 // Your main() here
}, false);
于 2009-02-15T15:24:24.867 に答える