Backbone: Exceção DOM 18 no navegador () no Safari 9.1

Criado em 13 mai. 2016  ·  11Comentários  ·  Fonte: jashkenas/backbone

SecurityError: DOM Exception 18 é lançado pelo Safari (iOS e OSX) a partir do momento em que pushState() é chamado 100 vezes.

https://forums.developer.apple.com/thread/36650
violino: https://jsfiddle.net/n3uxkyhr/5/

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);
}

falha com:

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

Todos 11 comentários

O link do fórum de desenvolvedores da Apple que você postou parece sugerir que esse problema é com o safari. O que você quer que o backbone faça sobre isso?

backbone precisa solucionar o bug do navegador.

Existe uma solução alternativa que você conhece @zowers? Esse bug ocorre apenas se o navegador for chamado 100 vezes de forma síncrona ou acontecerá se for chamado 100 vezes em geral?

para contornar eu tive que envolver navegar em um try/catch
no safari 9.1 (mais recente estável a partir de hoje) - 100 vezes o total
na visualização do desenvolvedor do safari 9.1.1 - é 100 vezes em 30 segundos

por que não resolve?
você diz que é aceitável ter uma funcionalidade que não funciona?

Coloquei isso lá porque lendo o bug do safari não vi uma solução aceitável. Usar um try/catch e não alterar a rota após a 100ª alteração não é aceitável IMO

Usar um try/catch e não alterar a rota após a 100ª alteração não é aceitável IMO

Acordado. Isso é uma falha silenciosa, que é pior do que o comportamento atual.

provavelmente navegar deve retornar ao hash em caso de erro

hoje o safari 9.1.1 com a correção foi lançado
no safari safari 9.1.1 history.pushState() falha apenas se for chamado 100 vezes em 30 segundos

fechado? esperando que as pessoas recebam a atualização em breve?

Este é um bug no Safari sem muito o que podemos fazer. Dado que o 9.1 foi lançado há apenas 2 meses, acho que estamos seguros de não fazer nada e deixar as pessoas atualizarem.

Esta página foi útil?
0 / 5 - 0 avaliações