OS X和iOS Safari中的history.replaceState限制引发SecurityError:DOM Exception 18。

8
在Safari中,当replaceState被调用超过100次时,会抛出以下错误:

SecurityError: DOM Exception 18:试图突破用户代理的安全策略。

更多信息:https://forums.developer.apple.com/thread/36650 我的问题是,在某些特定条件下,当用户滚动时我会更改URL(使用$(window).scroll(function() {...)。正如您所猜测的那样,我在不到2秒钟的时间内就达到了100的限制。 history.replaceState({}, '', newStringWithURLToUpdateInClientBrowser); 是否有任何解决此问题的方法?现有的允许管理history的库能否解决此问题?
所有其他浏览器都不受此问题影响。只有Webkit。 这是fiddle以查看错误:https://jsfiddle.net/j1sxxLwy/ 在Chrome中,它将达到100,但请在Safari中运行它。
2个回答

2

不幸的是,如果你只是简单地捕获错误,就会有很长一段时间所有的replaceState调用都将被忽略,你的URL将完全停止更新。

唯一的解决方法似乎是将对replaceState的调用节流到每300毫秒以下。(Chrome和Firefox似乎需要50毫秒的节流。)

history-throttled包是history.replaceStatehistory.pushState的一个即插即用替代品,它会自动为您应用适当的节流量。(声明:我是作者。)


0

你考虑过对滚动事件进行节流吗?

E.g.:

var timer = null;
$( window ).scroll( function() {
    clearTimeout( timer );
    timer = setTimeout( function() {
        history.replaceState( {}, '', newStringWithURLToUpdateInClientBrowser );
    }, 1000 );
} );

祝好,Raoul


1
我认为这只会延迟1秒钟的调用,但不会减少正在进行的调用数量。 延迟调用意味着用户滚动和UX响应滚动操作之间存在延迟。 - bikeman868

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接