У меня есть две мобильные страницы jquery, каждая в отдельном HTML-документе. Когда я ссылаюсь на второй документ, событие pagecreate запускается каждый раз. Это вызывает раздражающий побочный эффект при инициализации обработчиков несколько раз - один раз за каждый раз, когда страница была создана.JQuery mobile создает несколько обработчиков событий
Однако, я заметил, что есть разница между -
$ ('#' БТН) на ("нажать", функция() {...}).
и
$ (документ) .он ("щелчок", "#btn", функция() {...});
В первом случае обработчик события вызывается только один раз (это то, что я хочу), но во втором случае он вызывается один раз каждый раз, когда обработчик инициализирован. Может кто-нибудь объяснить, почему это так, и безопасно ли полагаться на первый случай, чтобы обработчик вызывался только один раз?
Вот начальная страница:
<body>
<div id="firstpage" data-role="page">
<a href="testpageinit_2.php" id="goto" class="ui-btn">Page 2</a>
</div>
</body>
и вторая страница:
<body>
<div id="secondpage" data-role="page">
<a href="#" id="btn" class="ui-btn">Click Me</a>
<a href="firstpage" id="btnback" class="ui-btn" data-rel="back">Back</a>
</div>
</body>
Мои JS выглядит следующим образом:
$(document).on("pagecreate", "#firstpage", function() {
alert("First page created");
});
$(document).on("pagecreate", "#secondpage", function() {
alert("Second page created");
// This results in just one handler
$('#btn').on("click", function() {
alert("btn clicked handler");
});
// This results in a handler being attached every time the page is created
$(document).on("click", "#btn", function() {
alert("document clicked handler");
});
});
Большое спасибо за очень полный ответ. Я понимаю, что в первом случае у меня есть прямой обработчик, а во втором случае у меня есть делегированный обработчик, но я не понимаю, почему прямой обработчик вызывается только один раз, хотя он инициализируется несколько раз (в отличие от делегированный обработчик)? И могу ли я полагаться на это поведение? – engeeaitch
Когда вы говорите «он инициализирован несколько раз», что вы имеете в виду? Из того, что я вижу в вашем коде, ваш прямой обработчик связан только один раз.Тур делегированный обработчик также связан только один раз, но он связан с неопределимым числом элементов, потому что он также может быть связан с элементами в будущем. Таким образом, на следующем 'pagecreate' новый прямой обработчик будет привязан к новому элементу' # btn', тогда как старый прямой обработчик будет привязан только к старому элементу '# btn'. Однако как исходные, так и новые делегированные обработчики будут привязаны как к старым, так и к новым элементам '# btn'. –
Поскольку событие pagecreate для второй страницы срабатывает каждый раз, когда загружается вторая страница, обработчики событий связаны несколько раз, когда вы перемещаетесь между первой и второй страницами. Однако я заметил, что, хотя прямой обработчик связан несколько раз, когда происходит событие, обработчик вызывается только один раз. Напротив, делегированный обработчик вызывается несколько раз. – engeeaitch