IE вызывает функции дважды на веб -сайте Ajaxified
-
27-10-2019 - |
Вопрос
У меня есть странная проблема, для которой я не могу придумать решения. Я написал немного кода 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 запускает два события.