Есть ли лучший способ присоединиться к pagehow в jQuery Mobile? - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть функция, которую мне нужно вызывать всякий раз, когда отображается страница, будь то при стандартной загрузке страницы или с помощью механизма навигации JJuery Mobile AJAX. В настоящее время мой код работает без проблем, но я чувствую, что есть более элегантный способ.

В нижней части моей страницы есть код, который присоединяется к событию pageshow для этой страницы. На pageshow он сосредоточится на текстовом поле, выдаст предупреждение (для тестирования), а затем отсоединится от события pageshow. Если я не откреплюсь, то, если я уйду со страницы и вернусь к ней, событие сработает дважды. Не так уж и много для фокусного события, но если вы попробуете это с оповещениями, вы увидите, что они начинают складываться: P

var focusOnQuantity = function () {
    $("#quantity").focus();
    alert('test');
    $('body').undelegate('#reportProduction', 'pageshow', focusOnQuantity);
};

// Bind to this page's pageshow event when loaded via jQuery Mobile AJAX
$('body').delegate('#reportProduction', 'pageshow', focusOnQuantity);

У меня также есть глобальный JS, и внутри него есть функция защиты jQuery, где я делаю тот же фокусный вызов в случае, если эта страница загружается напрямую.

(function ($) {
    $(function () {
        // For direct page load
        $("#quantity").focus();
    });
})(jQuery);

Как я могу инкапсулировать код в 1 блок, чтобы он работал на pageload для стандартной навигации и pageshow для навигации AJAX? Заранее спасибо за любую помощь.

1 Ответ

4 голосов
/ 22 ноября 2011

Если вы просто привязываетесь к событию pageshow, оно будет запускаться как при начальной загрузке, так и при каждой последующей pageshow:

$(document).delegate('#reportProduction', 'pageshow', focusOnQuantity);

Если этот код запускается в глобальной области видимости, он должен толькозапускать один раз для события pageshow на странице #reportProduction.

Вот jsfiddle вышеприведенного решения: http://jsfiddle.net/jasper/DHeva/ (обратите внимание, что я изменил настройку "onLoad" на "no wrap"(body) ", что означает, что код добавляется в конец элемента body без использования $(function () {...});).

...