背景
我把全屏web应用程序安装到iOS设备的主屏幕上,并在每次启动web应用程序时运行一些javascript
。
我相信这是Web应用程序开发人员非常需要的功能,可以防止网页在用户切换到另一个应用程序并返回时刷新
为了使javascript
每次将应用程序带到前台或启动时运行一些代码,我认为我可以简单地使用一些通知来监视focus
、blur
和visibilitychange
,或者可能查看document.activeElement
、document.hasFocus()
或document.hidden
。
以下是问题所在...
iOS 13还引入了一个错误,我已经报告了,但似乎不会很快修复,并且在13GM和13.1 beta中仍然存在。
错误
如果您有多个主屏幕web应用程序,似乎它们都共享同一个web容器。启动第二个Web应用程序会导致所有焦点类型通知在以前打开的Web应用程序上触发,就好像它们再次成为前台和中心一样。这意味着任何javascript
代码将运行如同已经启动一样,即使没有。
问题
我正在尝试找到解决此错误并在Web应用程序启动时得到通知的方法。使用类似onLoad
的代码仅在Web应用程序留在应用切换器中时运行一次。监视focus
事件类型将不必要地触发其他Web应用程序的启动。是否有任何其他事件或方法可以尝试调用,或者是否可以尝试实现任何技巧?
编辑
按照要求,以下是示例HTML:
<html>
<head>
<title>visibilitychange</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
</head>
<body id="body">
<h1>visibilitychange</h1>
<h3>Save this web clip to your home screen, then when you open it it'll automatically list the times the visibilitychange notification is called and the state</h3>
<br /><br />
<p>Initial page visibility was <b id="status">unknown</b>.</p>
<div id="target"></div>
<script type="text/javascript">
document.getElementById('status').innerHTML = document.hidden ? 'hidden' : 'visible';
var target = document.getElementById('target');
function logToScreen(text) {
var timeBadge = new Date().toTimeString().split(' ')[0];
var newState = document.createElement('p');
newState.innerHTML = '<span class="badge">' + timeBadge + '</span> ' + text + '</b>';
target.appendChild(newState);
}
function isPageHidden() {
console.log('isPageHidden() ==' + document.visibilityState);
logToScreen('isPageHidden() ==' + document.visibilityState);
return document.visibilityState == 'hidden'; // document.hidden;
}
document.addEventListener("visibilitychange", function(event)
{
console.log('visibilitychange event listener');
logToScreen('visibilitychange event listener');
if(!isPageHidden()) {
console.log('page opened');
logToScreen('page opened');
}
}, false);
</script>
</body>
</html>
document.hidden
似乎也会返回false
:( - Darren