iOS Safari 支持 storageEvents 吗?
does iOS Safari support storageEvents?
我有以下示例代码(位于 https://d-dsuo5j1fc.now.sh/),它应该显示 2 个不断变化的日期字符串。第一个是简单的 500 毫秒循环,第二个是 StorageEvent 的结果。这个想法是在两个选项卡中加载此页面,这样每个选项卡都会收到另一个选项卡中本地存储更改的警报。
它在 Chrome/iOS 中工作正常,但在 Safari iOS 中,第二个字符串从未更新,表明它没有触发 onStorage 事件。
<body>
Own timer<span id='s'> </span><br>
From storage event <span id='ev'> </span>
</body>
<script>
let s = document.getElementById('s');
let ev = document.getElementById('ev');
function onStorageEvent(storageEvent){
ev.innerHTML = storageEvent.newValue; // display the storage event value
}
window.addEventListener('storage', onStorageEvent, false);
// every 500ms, generate a new string, display it and write it to localstorage
setInterval(()=>{
let d = new Date().toGMTString() + ' ' + Math.random();
s.innerHTML = d; // display our fresh value
localStorage.setItem('foo',d); // and write it to localstorage
}
,500);
</script>
此外,对于 iOS 上 Safari 的 HTML5 不兼容性,有什么好的资源建议吗?
It works fine in Chrome/iOS, but in Safari iOS, the second string is never updated, suggesting that it didn't fire the onStorage event.
我也用下面的代码试过了:
let s = document.getElementById('s');
let ev = document.getElementById('ev');
function onStorageEvent(storageEvent) {
ev.innerHTML = storageEvent.newValue; // display the storage event value
document.getElementById("console").innerHTML += "<br>something has changed (Event type: '" + event.type + "')";
}
window.addEventListener('storage', onStorageEvent, false);
// every 500ms, generate a new string, display it and write it to localstorage
setInterval(() => {
let d = new Date().toGMTString() + ' ' + Math.random();
s.innerHTML = d; // display our fresh value
localStorage.setItem('foo', d); // and write it to localstorage
}, 500);
Own timer<span id='s'> </span><br> From storage event <span id='ev'> </span>
<div id="console"></div>
这里是 JSFiddle link 因为这个例子在 SO 沙箱工具中不起作用。所以我在字符串中显示了 event.type
(document.getElementById("console").innerHTML += "<br>something has changed (Event type: '" + event.type + "')";
) 以确保触发了正确的事件。但正如您在下面的 GIF 中看到的那样,它对我来说效果很好。我还做了一些其他测试来仔细检查,它们都工作正常。
我正在使用 iOS 12.4.
Also, any suggestions for a good resource for the HTML5 incompatibilities of Safari on iOS?
为了进行三重检查,我还搜索了一些可靠的来源。最著名的是 caniuse.com (no search results) and developer.mozilla,但即使他们也没有相关信息。
所以三重检查将不起作用。然而,由于我已经用不同的 iOS 版本(8、9、10、11)亲自尝试过它,所以它显然确实有支持,我们可以回答这个问题:
does iOS Safari support storageEvents?
是的,它确实支持 iOS 11 及更高版本。
如果您有任何问题,请告诉我。
编辑#1
顺便说一句,如果您想自己测试一下(如果您不像我一样拥有 iPhone),可以使用一些模拟器,例如 appetize.io.
您是否在隐私浏览模式下进行测试? 在这种情况下,由于 Apple 的隐私问题,Safari 的行为有所不同。
这是一个视频,显示存储事件在 iOS 6 和 iPhone 5 上正常工作(相同的代码只是更改为支持 ES5,let
转换为 var
,箭头函数转换为普通函数)。但是一旦你打开隐私浏览,它就会停止工作。
我有以下示例代码(位于 https://d-dsuo5j1fc.now.sh/),它应该显示 2 个不断变化的日期字符串。第一个是简单的 500 毫秒循环,第二个是 StorageEvent 的结果。这个想法是在两个选项卡中加载此页面,这样每个选项卡都会收到另一个选项卡中本地存储更改的警报。
它在 Chrome/iOS 中工作正常,但在 Safari iOS 中,第二个字符串从未更新,表明它没有触发 onStorage 事件。
<body>
Own timer<span id='s'> </span><br>
From storage event <span id='ev'> </span>
</body>
<script>
let s = document.getElementById('s');
let ev = document.getElementById('ev');
function onStorageEvent(storageEvent){
ev.innerHTML = storageEvent.newValue; // display the storage event value
}
window.addEventListener('storage', onStorageEvent, false);
// every 500ms, generate a new string, display it and write it to localstorage
setInterval(()=>{
let d = new Date().toGMTString() + ' ' + Math.random();
s.innerHTML = d; // display our fresh value
localStorage.setItem('foo',d); // and write it to localstorage
}
,500);
</script>
此外,对于 iOS 上 Safari 的 HTML5 不兼容性,有什么好的资源建议吗?
It works fine in Chrome/iOS, but in Safari iOS, the second string is never updated, suggesting that it didn't fire the onStorage event.
我也用下面的代码试过了:
let s = document.getElementById('s');
let ev = document.getElementById('ev');
function onStorageEvent(storageEvent) {
ev.innerHTML = storageEvent.newValue; // display the storage event value
document.getElementById("console").innerHTML += "<br>something has changed (Event type: '" + event.type + "')";
}
window.addEventListener('storage', onStorageEvent, false);
// every 500ms, generate a new string, display it and write it to localstorage
setInterval(() => {
let d = new Date().toGMTString() + ' ' + Math.random();
s.innerHTML = d; // display our fresh value
localStorage.setItem('foo', d); // and write it to localstorage
}, 500);
Own timer<span id='s'> </span><br> From storage event <span id='ev'> </span>
<div id="console"></div>
这里是 JSFiddle link 因为这个例子在 SO 沙箱工具中不起作用。所以我在字符串中显示了 event.type
(document.getElementById("console").innerHTML += "<br>something has changed (Event type: '" + event.type + "')";
) 以确保触发了正确的事件。但正如您在下面的 GIF 中看到的那样,它对我来说效果很好。我还做了一些其他测试来仔细检查,它们都工作正常。
我正在使用 iOS 12.4.
Also, any suggestions for a good resource for the HTML5 incompatibilities of Safari on iOS?
为了进行三重检查,我还搜索了一些可靠的来源。最著名的是 caniuse.com (no search results) and developer.mozilla,但即使他们也没有相关信息。
所以三重检查将不起作用。然而,由于我已经用不同的 iOS 版本(8、9、10、11)亲自尝试过它,所以它显然确实有支持,我们可以回答这个问题:
does iOS Safari support storageEvents?
是的,它确实支持 iOS 11 及更高版本。
如果您有任何问题,请告诉我。
编辑#1
顺便说一句,如果您想自己测试一下(如果您不像我一样拥有 iPhone),可以使用一些模拟器,例如 appetize.io.
您是否在隐私浏览模式下进行测试? 在这种情况下,由于 Apple 的隐私问题,Safari 的行为有所不同。
这是一个视频,显示存储事件在 iOS 6 和 iPhone 5 上正常工作(相同的代码只是更改为支持 ES5,let
转换为 var
,箭头函数转换为普通函数)。但是一旦你打开隐私浏览,它就会停止工作。