javascript OS X和iOS Safari历史记录,replaceState限制引发安全错误:DOM异常18

t8e9dugd  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(175)

在Safari中replaceStatewill be called more than 100 times时,它将抛出:
安全错误:DOM例外18:试图突破用户代理的安全策略。
更多信息:https://forums.developer.apple.com/thread/36650
我的问题是,在某些特定条件下,我改变URL时,用户滚动(使用$(window).scroll(function() {...。正如你可能猜到的,我达到了100在不到2秒的限制。
history.replaceState({}, '', newStringWithURLToUpdateInClientBrowser);
有什么解决办法吗?允许管理history的现有库可以解决这个问题吗?
所有其他浏览器都不受此问题的影响。只有Webkit。下面是查看错误的小提琴:https://jsfiddle.net/j1sxxLwy/
在Chrome中它会达到100,但尝试在Safari中运行它。

idfiyjo8

idfiyjo81#

不幸的是,如果您只是简单地捕捉到错误,那么在某些时期,所有replaceState调用都将被忽略,您的URL将完全停止更新。
唯一的解决办法似乎是将对replaceState的调用限制在每300毫秒以内(Chrome和Firefox似乎同样需要50毫秒的限制)。
history-throttled软件包是history.replaceStatehistory.pushState的直接替代产品,可自动为您应用适当的限制量。(披露:我是作者。)

kpbpu008

kpbpu0082#

你有没有考虑过扼杀滚动事件?
例如:

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

干杯劳尔

相关问题