更改标签时,Javascript会在iPad上暂停:有没有办法知道什么时候回来?
我在线程中描述了相同的问题 我的问题是,当我回到暂停的选项卡时,是否能被注意到更改标签时,Javascript会在iPad上暂停:有没有办法知道什么时候回来?,javascript,ipad,safari,dom-events,Javascript,Ipad,Safari,Dom Events,我在线程中描述了相同的问题 我的问题是,当我回到暂停的选项卡时,是否能被注意到 onfocus和onblur事件不适用于待暂停选项卡 守则: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="http://code.jquery.com/jquery-1.7.1.min.js" ></script> <script type="text/javascript"&g
onfocus
和onblur
事件不适用于待暂停选项卡
守则:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="http://code.jquery.com/jquery-1.7.1.min.js" ></script>
<script type="text/javascript">
window.onblur = function () {
console.log("blur");
$("#whatevent").append("blur<br/>");
}
window.onfocus = function () {
console.log("focus");
$("#whatevent").append("focus<br/>");
}
window.onunload = function () {
console.log("unload");
$("#whatevent").append("unload<br/>");
}
window.onload = function () {
console.log("load");
$("#whatevent").append("load<br/>");
}
</script>
</head>
<body>
<div id="whatevent"></div>
</body>
</html>
window.onblur=函数(){
控制台日志(“模糊”);
$(“#whatevent”)。追加(“blur
”;
}
window.onfocus=函数(){
控制台日志(“焦点”);
$(“#whatevent”)。追加(“焦点
”;
}
window.onunload=函数(){
控制台日志(“卸载”);
$(“#whatevent”)。追加(“卸载
”;
}
window.onload=函数(){
控制台日志(“加载”);
$(“#whatevent”)。追加(“加载
”;
}
只有
onload
(但只有我第一次加载页面时)当我切换标签时,事件才能在iPad上运行。两年前有人向我提出了这个问题。不幸的是,只有几个答案,其中一个似乎是实现这一效果的唯一方法。在苹果能够在mobile safari中实现完整页面可见性API之前,我只能使用我创建的自定义对象,该对象将使用该API,如果不可用,则返回心跳滴答器。然而,据我所知,没有很好的方法来检查即将发生的制表符切换
演示其唯一真实方法的对象。它本质上只接受焦点事件的处理函数,该事件在浏览器返回源选项卡时触发。回退充其量是黑客攻击,不仅在页面重新进入时,而且在脚本停止时间超过计时器阈值时触发;这可能是在键盘可见、滚动或正在运行的脚本阻止requestAnimationFrame触发时发生的。由于滚动是最常见的行为,我添加了一个处理程序,用于重置上次保存的时间,以便焦点事件不会触发
这是脚本的主要部分,包括如上所述的“hacky”方法:
_that.onFocus = function(handler, params) {
var hiddenProp = getHiddenProp();
console.log("Hidden prop: " + hiddenProp);
if (hiddenProp) {
var evtName = hiddenProp.replace(/[H|h]idden/, "") + "visibilitychange";
document.addEventListener(evtName, function(e) {
if (isHidden()) {
handler(e, params);
}
}, false);
}else {
var handlerObj = {"handler": handler};
if (params !== undefined) {handlerObj.params = params}
_handlers.push(handlerObj);
startLoop();
}
};
其余的可以用小提琴来读。为了查看后备功能,您必须使用平板电脑(否则,没有平板电脑,您为什么需要此功能?)
请注意,.onFocus方法可能会为其第二个参数接受一个参数数组,然后将该数组传递给事件处理程序。这意味着您的事件处理程序将始终为其第一个参数(如果不支持API,则为null)提供一个事件对象,并将您的参数数组作为其第二个参数
另外,这段代码已经测试了几个小时,所以可能会出现故障。在Mobile Safari投入使用之前,我将非常感谢任何建设性的批评,以使其具有生产价值。如果您只是想让代码正常工作,您可以将其发布在此处,并可能会找到答案,如链接问题中所示。