L'échange d'état déclenche chaque fois que je fais un état push

J'utilise history.js pour gérer le bouton arrière. Dans history.js, l'échange d'états déclenche chaque fois que je fais un pushstate. Pourquoi?

    Selon cette discussion sur github , il est prévu que le comportement de history.js

    Cette demande de tirage prétend avoir modifié history.js pour être plus en ligne avec les spécifications du W3C.

    Je voulais ajouter, oui, c'est le comportement attendu de History.js. Dans le même temps, il y a plus de discussions qui critiquent ce comportement car ce n'est pas la norme W3C et crée une certaine confusion.

    Bref, pour répondre à votre question: Dans la fonction History.js pushState() est un appel à l'échange d'états à la fin.

    À l'inverse de cette solution, vous pouvez simplement modifier (pousser) votre nouvel état et laisser la fonction onstatechange () – gérer la transition. L'inconvénient est que vous n'êtes pas en mesure de gérer les exceptions / ou de les écrire dans le gestionnaire d'événements onstatechange.

    Personnellement, je préfère la façon dont W3C de gérer cela, car vous pouvez distinguer entre le bouton retour / avant et PushState. Les mainteneurs d'History.js travaillent sur une solution de drapeau interne, qui vous permet de modifier ce comportement:

    Notez comment les appels ci-dessus [pushstate-calls] déclenchent des événements d'échange d'état, si, pour une raison ou une autre, vous ne voulez pas que cela se produise, vous pouvez utiliser ce qui suit dans votre gestionnaire d'échange d'états:

     if ( History.getState().internal ) { return; } 

    * Cette fonctionnalité est en cours de développement et ne peut être utilisée qu'avec la version 'dev' de History.js! J'espère que cela aidera d'autres personnes dans le futur 🙂

    Après avoir essayé d'accomplir cela depuis un jour maintenant, j'ai finalement trouvé la solution ici: https://github.com/browserstate/history.js/issues/47#issuecomment-25750285

    Le code est assez simple, ce qui suit est cité dans le lien:

    Lorsque vous appuyez sur votre état

     History.pushState({ _index: History.getCurrentIndex(), someData: ... }, someTitle, someUrl); 

    Et ensuite dans le cas de la liaison

     History.Adapter.bind(window, 'statechange', function () { var currentIndex = History.getCurrentIndex(); var internal = (History.getState().data._index == (currentIndex - 1)); if (!internal) { // your action } });