Firefox 用の Greasemonkey スクリプトを作成して、フォーカスが合っていないウィンドウが検出されたときに一部のページの動作を変更しようとしています。別のタブまたはウィンドウがアクティブな場合でも、ページがまだフォーカスされているかのように機能し続けることを望みます。
インライン Javascript ( 、 ) で機能するように見えるCAPS セキュリティ ポリシーを調べ始めましたが、フォーカス イベントへの外部 jQuery スクリプト プラグイン アクセスには影響しませんでした。window.onfocus
window.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);
}