Как правильно использовать pageinit?
У меня есть один файл для каждой страницы, и я пытаюсь реализовать обработчик событий pageinit на каждой странице (Я думаю, что то, что принадлежит строго одной странице, должно быть объявлено там), как показано ниже:
<body>
<div id="myPage" data-role="page">
<!-- Content here -->
<script type="text/javascript">
$("#myPage").live('pageinit', function() {
// do something here...
});
</script>
</div>
</body>
событие привязывается к странице, поэтому код выполняется, но теперь моя проблема - если я иду на другую страницу и вернуться на pageinit событие будет выполнен в два раза. Я думаю, это потому, что ... метод live снова привязывает событие pageinit к странице. Но разве событие pageinit не должно вызываться только один раз при инициализации страницы? Чего мне здесь не хватает?
5 ответов
Я думаю, что, вероятно, лучше всего переместить код JavaScript в другой файл, так как во время навигации по вашему сайту jQuery Mobile может очистить (читать: удалить из DOM), что myPage
страница и, следовательно, придется загрузить его снова и hense повторно запустить тот же блок кода, который вы определили и привязать 2 слушателей для pageinit
событие.
вот почему они предлагают использовать live
или on
функции однако он падает, если вы включаете код привязки на странице ;)
однако, если вы настаиваете на том, чтобы ваш код размещался на каждой странице, чем использовать bind
вместо live
.
Ref:http://jquerymobile.com/demos/1.0/docs/pages/page-cache.html
jQuery Mobile поэтому имеет простой механизм для поддержания DOM в порядке. Всякий раз, когда он загружает страницу через Ajax, jQuery Mobile помечает страницу, которая будет удалена из DOM при переходе от нее позже (технически, на странице событие.)
Я решаю проблему, передавая имя события, в этом случае "pageinit" вместо обработчика.
<script defer="defer" type="text/javascript">
var supplier = null;
$("#pageID").die("pageinit"); //<--- this is the fix
$("#pageID").live("pageinit", function(event){
console.log("initialized - @(ViewBag.ID)");
supplier = new Tradie.Supplier();
supplier.Initialize("@(ViewBag.ID)");
});
Ref: http://www.rodcerrada.com/post/2012/04/26/jQuery-Mobile-Pageinit-Fires-More-Than-Once.aspx
Я уверен, что они рекомендуют привязать pageinit к документу, используя on (). Е. Г.
$(document).on ('pageinit', '#myPage', function (event) {
вместо привязки pageinit к странице, которая повторно вводится. На самом деле, я думал $(документ).on () был рекомендуемым способом привязки событий в jQuery, в общем, сейчас.
быстрый обходной путь, который я использовал, объявляет переменную, содержащую функцию обработчика.
var handler = function() {
// your code
};
тогда всегда используйте die()
перед связыванием обработчика с live()
$( "#myPage" ).die( handler ).live( handler );
Я уверен, что это не предполагаемое использование авторами, но это делает трюк, вы можете оставить свой код на странице DIV.
$("#page1").live("pageinit", function () {
alert('pageinit');
$("#page1").die("pageinit"); //<--- prevent from firing twice on refresh
});