我正在尝试为 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 脚本中,因为页面已经加载了它。
// ==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);
}