Backbone: Safari 9.1 中的 navigate() 上的 DOM 异常 18

创建于 2016-05-13  ·  11评论  ·  资料来源: jashkenas/backbone

SecurityError: DOM Exception 18 从pushState()被调用 100 次起就被 Safari(iOS 和 OSX)抛出。

https://forums.developer.apple.com/thread/36650
小提琴: https :

var TestRouter = Backbone.Router.extend( {
    initialize: function() {
        this.route("/test/:id", function( id ) { console.log("test" + id) });
    }
} );
var router = new TestRouter();
Backbone.history.start({pushState: true});

try {
  for(var i = 0; i < 200; i++ ) {
      router.navigate("/test/"+i);
    }
    alert("passed, i = " + i);
} catch( e ) {
    var msg = "failed on i " + i + " with error: " + e + "\nStack: " + e.stack;
  console.error( e, msg );
  alert(msg);
}

失败:

failed on i 100 with error: Error: SecurityError: DOM Exception 18
Stack: pushState@[native code]
navigate<strong i="14">@https</strong>://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone.js:1823:69
navigate<strong i="15">@https</strong>://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone.js:1522:32
global code<strong i="16">@https</strong>://fiddle.jshell.net/n3uxkyhr/6/show/:63:22"
global code — show:68
wontfix

所有11条评论

您发布的苹果开发者论坛链接似乎表明此问题与 safari 有关。 您希望骨干对此做什么?

骨干需要解决浏览器错误。

您是否知道@zowers 的解决方法?是否仅当导航被同步调用 100 次时才会发生此错误,或者如果它通常被调用 100 次会发生?

解决方法我必须将导航包装在try/catch
在 safari 9.1(截至今天的最新稳定版本)中 - 总共 100 倍
在 safari 9.1.1 开发者预览版中 - 30 秒内 100 次

为什么它不会修复?
你说有一个不工作的功能是可以接受的吗?

我把它放在那里是因为阅读了 safari bug 我没有看到一个可接受的解决方案。 在第 100 次更改后使用 try/catch 并且不更改路线是不可接受的 IMO

在第 100 次更改后使用 try/catch 并且不更改路线是不可接受的 IMO

同意。 这是一个无声的失败,比当前的行为更糟​​糕。

如果出现错误,导航应该回退到散列

今天发布了带有修复程序的 Safari 9.1.1
在 safari safari 9.1.1 history.pushState()只有在 30 秒内调用 100 次时才会失败

关闭? 希望人们尽快得到更新?

这是 Safari 中的一个错误,我们无能为力。 鉴于 9.1 仅发布了 2 个月,我认为我们不做任何事情并让人们更新是安全的。

此页面是否有帮助?
0 / 5 - 0 等级