JavaScript WTF, фантомный вызов функции - PullRequest
0 голосов
/ 25 августа 2009

Я пытаюсь получить всплывающие подсказки, которые появляются, когда вы нажимаете на ярлыки определенного класса, и исчезают, когда вы нажимаете. Ничего не появляется Я могу установить точки останова в firebug и увидеть всплывающую подсказку «загрузка», а затем, когда ajax вернет корректные обновления всплывающей подсказки, тогда removeTooltip вызывается фантомно (трассировка стека просто говорит F () F () в jquery). Таким образом, всплывающая подсказка устанавливается и удаляется так быстро, что ее никогда не видно.

HelpText.removeTooltip = function() {
    $('#activeHelpTip').remove();
    $('body').unbind('click', HelpText.removeTooltip);
}

HelpText.initToolTip = function(clickedElement) {
    $('body').click(HelpText.removeTooltip);
    $(clickedElement).append('<span id="activeHelpTip" class="helpTip">Loading help...</span>');
}

HelpText.updateTooltip = function(helpString, clickedElement, methodName) {
    if (helpString == null) { helpString = "Help text has not been defined for selected field"; }
    $('#activeHelpTip').html(helpString);
}

$(document).ready(function() {
    $('.helpText').click(function() {
        var helpRequested = $(this).html();
        var path = window.location.pathname;
        var fullPage = path.substring(path.lastIndexOf('/') + 1);
        var page = fullPage.substring(0, fullPage.indexOf('.'));
        var label_helpRequested = $(this).html();

        HelpText.initToolTip(this);
        HelpText.getHelpText(page, label_helpRequested, this);
    });

HelpText.getHelpText = function(pageNameParam, fieldNameParam, element) {
    var params = { pageName: pageNameParam, fieldName: fieldNameParam };

    if (this._webRequest) {
        // abort the previous web service call if we 
        // are issuing a new one and the previous one is 
        // active.
        this._webRequest.get_executor().abort();
        this._webRequest = null;
    }
    // this._webRequest is a handler on the async request
    this._webRequest = Sys.Net.WebServiceProxy.invoke(HelpTextServiceURL,
                                                "GetHelpText",
                                                false, /* use GET  */
                                                params, /* parameters to the Ajax service method - case and type sensitive */
                                                HelpText.updateTooltip, /* success callback */
                                                null, /* failure callback */
                                                element); /* user context - preserved info - accessed in the success callback - in this case will contain SPAN */
}

Ответы [ 2 ]

2 голосов
/ 25 августа 2009

Ваша функция initToolTip устанавливает обработчик по нажатию для всего тела страницы для вызова removeToolTip(). Я предполагаю, что происходит то, что, когда событие click срабатывает на $('.helpText'), добавляется всплывающая подсказка, а затем событие click поднимается до элемента body, и в этот момент вызывается removeToolTip().

1 голос
/ 25 августа 2009

вы не отменили всплывающее уведомление о событии, которое показывает всплывающую подсказку, и первое, что вы делаете, это прикрепляете обработчик удаления к телу. Поэтому, когда ваш обработчик инициализации заканчивается, jQuery и браузер делегируют это событие вверх по цепочке, где ваш обработчик удаления просматривается и обрабатывается.

Решение состоит в том, чтобы отменить всплывание в вашем обработчике инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...