Вопрос

У меня есть странная проблема, для которой я не могу придумать решения. Я написал немного кода JavaScript, чтобы загрузить какой -то контент с помощью вызова AJAX, который также делает некоторую анимацию. Чтобы сделать веб -сайт функциональным, я использую jQuery с ИСТОРИЯ.js. Анкет Это сценарий:

(function (window, undefined) {
    getContent(true); // Function that gets the initial content via AJAX and does some animation
                      // The parameter specifies that the call to the function is onload

    History.Adapter.bind(window,'statechange',function(event){ 
       getContent(); 
    });

    function getContent(onload){
       if(onload == true){
         // Do onload stuff. Only slightly differs from other event calls
         // If there is no state given define default one ie 'home'
         alert('onload event triggered'); // For debug purposes
       } else {
         // Do other event stuff
         alert('click event triggered'); // For debug purposes
       }
     }

    somelinks.on('click',a,function(){ // Setup some eventlisteners that push the state });

})(window);

В браузерах, которые поддерживают HTML5 History/State API (Firefox, Chrome), это работает безупречно. При загрузке или перезагрузке определенного URL или на событии клика функция выполняет свою работу.

В т.е. это также работает (с хэшами, конечно), однако, когда я перезагружаю страницу (то есть пример. Таким образом, в Firefox перезагрузка запускает оповещение о событии Onload, но в IE событие Onload и предупреждение о событии Click запускаются.

Что мне нужно, так это способ наказания моего кода или логической проверки, чтобы предотвратить IE, чтобы вызвать второй getContent (). Я искал аналогичные проблемы (ключевые слова: т.е., history.js и т. Д.), Но ничего не найдено.

Надеюсь, кто -нибудь поможет мне с проблемой.

Это было полезно?

Решение

(function (window, undefined) {

    var getContentOK = true;

    getContent(true);

    History.Adapter.bind(window,'statechange',function(event){
       getContent(false);
    });

    function getContent(onload){
       if (getContentOK === true) {

           if(onload == true){
               // Do onload stuff. Only slightly differs from other event calls
               // If there is no state given define default one ie 'home'
               alert('onload event triggered'); // For debug purposes
           } else {
               // Do other event stuff
               alert('click event triggered'); // For debug purposes
           }

           getContentOK = false;
           setTimeout(function () {
               getContentOK = true;
           }, 500);
       }
     }

    somelinks.on('click',a,function(){ // Setup some eventlisteners that push the state });

})(window);

Это закроет statechange обработчик событий только запустить getContent() один раз каждые 500 мс.

Обратите внимание, что я добавил несколько логических флагов, один, чтобы запустить statechange обработчик событий и один, чтобы имитировать ваш onload переменная. firstRun будет выходить true на первом забеге, а затем false На каждом последующем пробеже.

Это не такое хорошее решение, как выяснить, что происходит с History.js Плагин, но у меня нет опыта с ним, поэтому я не могу сказать, почему IE запускает два события.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top