2

Firefox 用の Greasemonkey スクリプトを作成して、フォーカスが合っていないウィンドウが検出されたときに一部のページの動作を変更しようとしています。別のタブまたはウィンドウがアクティブな場合でも、ページがまだフォーカスされているかのように機能し続けることを望みます。

インライン Javascript ( 、 ) で機能するように見えるCAPS セキュリティ ポリシーを調べ始めましたが、フォーカス イベントへの外部 jQuery スクリプト プラグイン アクセスには影響しませんでした。window.onfocuswindow.onblur

これは私のテスト ページで、jQuery プラグインを使用してフォーカスを検出します。プラグインはここではインラインですが、場合によっては外部スクリプトになることもあります。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
    <title>jQuery focus test</title>
<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">

(function($) {
    $.fn.focuscheck = function() {
        function focusOn () {
            document.getElementById('console').innerHTML += '<div>Focus event handler fired.</div>';
        };
        function focusOff () {
            document.getElementById('console').innerHTML += '<div>Blur event handler fired.</div>';
        };

        $(window).bind('focus', focusOn);
        $(window).bind('blur', focusOff);
    };
})(jQuery);

</script>
</head>

<body>    
    <div id="console"></div>
    <script type="text/javascript">
    $('#func').focuscheck();
    </script>
</body>

</html>

そして私の Greasemonkey スクリプト。joanpiedra.com の jQuery Greasemonkey コードを適応させようとしています。focuscheckこの場合、テスト ページの jQuery プラグイン関数コードを完全に置き換えようとしました。すべての行はオリジナルと同じですがfunction focusOff()、異なる結果を表示する必要があります。関数全体を置き換えずにこれを行う方法があるかどうかはわかりません。それがオプションである場合、単一のfocusOff関数または行を$(window).bind('blur', focusOff);.

現在、テスト ページで Greasemonkey スクリプトが機能しません。出力に変化はありません。また、ページがすでに jQuery をロードしているため、Greasemonkey スクリプトに jQuery を追加する必要があるかどうかもわかりません。

// ==UserScript==
// @name          jQuery
// @namespace     http://www.joanpiedra.com/jquery/greasemonkey
// @description   Play nicely with jQuery and Greasemonkey
// @author        Joan Piedra
// @homepage      http://www.joanpiedra.com/jquery/greasemonkey
// @include       *
// ==/UserScript==

// Add jQuery
var GM_JQ = document.createElement('script');
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(GM_JQ);

// Check if jQuery's loaded
function GM_wait() {
    if(typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(GM_wait,100); }
    else { $ = unsafeWindow.jQuery; letsJQuery(); }
}
GM_wait();

// All your GM code must be inside this function
function letsJQuery() {
    var script = document.createElement('script');
    script.type = "text/javascript";
    script.innerHTML = "(function($){\
        \
        $.fn.focuscheck = function(){\
            function focusOn () {\
                document.getElementById('console').innerHTML += '<div>Focus event handler fired.</div>';\
            };\
            function focusOff () {\
                document.getElementById('console').innerHTML += '<div>CHANGED event handler.</div>';\
            };\
        \
        $(window).bind('focus', focusOn);\
        $(window).bind('blur', focusOff);\
        };\
    })(jQuery);";

    document.getElementsByTagName('head')[0].appendChild(script);   
}
4

1 に答える 1

2

関数全体を置き換えずにこれを行う方法があるかどうかはわかりません

はいあります。以下のコードを参照してください。

また、ページがすでに jQuery をロードしているため、Greasemonkey スクリプトに jQuery を追加する必要があるかどうかもわかりません。

その必要はありません。以下のコードを参照してください。

html(あなたのものと同じ-「インラインJSから起動」を追加しましたinnerHTML

<html lang="en">
.
.
function focusOn () {
   document.getElementById('console').innerHTML += '<div>Focus event handler fired from inline JS.</div>';
};
function focusOff () {
   document.getElementById('console').innerHTML += '<div>Blur event handler fired from inline JS.</div>';
};
.
.
</html>

GMスクリプト

// ==UserScript==
// @name           TESTE 2
// @namespace      TESTE 2
// @description    TESTE 2
// @include        file:///*
// ==/UserScript==


$ = unsafeWindow.$
$(window).off('blur')

function focusOff () {
    document.getElementById('console').innerHTML += '<div>Blur event handler fired from Greasemonkey.</div>';
};

$(window).on('blur', focusOff);

結果

結果画像

そして、ここで、使用しない理由unsafeWindow: http://wiki.greasespot.net/UnsafeWindow

編集

コメントでの質問について

ありがとうございました。それがまさに私が探していたものです。unsafeWindow の代わりに安全なラッパーの使用を検討します。フォローアップの質問を気にしない場合:スライド パネルのデモ- 同様のコードを適応させてクリック機能をオーバーライドし $('.btn-slide').unbind('click')、新しい機能を追加しようとしましたが、うまくいきません。イベントはログに記録されますが、ボタンは引き続きアクティブになります。$('.btn-slide').bind('click', function(event) { event.preventDefault(); console.log('button clicked'); });スライドのアニメーションを防ぐにはどうすればよいですか?

新しいコード:

// ==UserScript==
// @name           TESTE 3
// @namespace      TESTE 3
// @description    TESTE 3
// @include        http://www.webdesignerwall.com/demo/jquery/*
// ==/UserScript==

$ = unsafeWindow.$

$(window).load(function(){
    $('.btn-slide')
        .unbind('click')
        .bind('click', function(event) {
            alert('my function here')
            console.log('button clicked')
        })
});
于 2012-04-16T12:45:58.347 に答える