Модель событий jQuery и предотвращение дублирующихся обработчиков

Еще раз я хочу загрузить страницу, которая содержит ее собственный сценарий в отделение, использующее $ ("divid") .load (...). Проблема, с которой я сталкиваюсь, связана с событиями. Скажем, мы инициировали ("обезьяна") от родительской страницы, и на загруженной странице мы связываем ("обезьяна") и просто делаем предупреждение ("обезьяна, связанная"). Если тот же метод загрузки называют многократно, связывание называют многократно. Теперь я мог просто развязать его, прежде чем я свяжу его, или проверю количество обработчиков перед связыванием и затем не обяжу его предотвращать это. Никакая опция не масштабируема как какой, если я позже хочу связать с тем триггером в другом "sub страницу" (страница, загруженная в отделение).

Что я идеально хочу сделать, тогда проверка, если обработчик, который я собираюсь добавить уже, существует, но я все еще ХОЧУ использовать анонимные обработчики... (выяснение у слишком с тем последним запросом, я думаю). В настоящее время у меня есть обходное решение при помощи pre-defined/named методов и затем проверяющий это перед связыванием.

// Found this on StackOverflow
function getFunctionName(fn)
{
 var rgx = /^function\s+([^\(\s]+)/
 var matches = rgx.exec(fn.toString());
 return matches ? matches[1] : "(anonymous)"
}

function HandlerExists(triggerName, handlerName) {
        exists = false;
        if ($(document).data('events') !== undefined) {
            var event = $(document).data('events')[triggerName];
            if(event !== undefined)
            {
                $.each(event, function(i, handler) {
                    alert(handlerName);
                    if (getFunctionName(handler) == handlerName) {
                        exists = true;
                    }
                });
            }
        }
        return exists;
    }

Это - довольно сырой способ идти об этом, я чувствую, но, кажется, работает. Я просто делаю следующее перед связыванием следующим образом:

if (!HandlerExists("test", "theMethod")) {
    $(document).bind("test", theMethod);
}

У кого-либо есть более изящное решение? например, есть ли какой-либо способ проверить, что конкретный сценарий загружается? таким образом, я мог использовать getScript (), чтобы загрузить js из дочерней страницы на первой загрузке и затем затем не загрузить его на последующих загрузках (и просто запустить триггер, который будет обработан им существующий ранее js)..

33
задан Mr AH 1 February 2010 в 21:49
поделиться

2 ответа

ммм Как насчет использования One () ? http://api.jquery.com/One/

Или я полностью не понимаю?

7
ответ дан 27 November 2019 в 17:42
поделиться

Это не полный ответ, но я быстро нашел, как исправить весь свой код с минимальными изменениями. В моем классе «Base» JS (это объект, который используется на каждой странице для стандартных подключений кнопки по имени класса и т. Д.) Я добавил следующий метод, который выполняет чек для обработчиков дупэ:

BindOnce: function(triggerName, fn) {
    function handlerExists(triggerName, theHandler) {
        function getFunctionName(fn) {
            var rgx = /^function\s+([^\(\s]+)/
            var matches = rgx.exec(fn.toString());
            return matches ? matches[1] : "(anonymous)"
        }
        exists = false;
        var handlerName = getFunctionName(theHandler);
        if ($(document).data('events') !== undefined) {
            var event = $(document).data('events')[triggerName];
            if (event !== undefined) {
                $.each(event, function(i, handler) {
                    if (getFunctionName(handler) == handlerName) {
                        exists = true;
                    }
                });
            }
        }
        return exists;
    }
    if (!handlerExists(triggerName, fn)) {
        $(document).bind(triggerName, fn);
    }
},

, тогда я только что призываю его вместо Метод связывания!

$.mystuff.BindOnce("TheTrigger", OnTriggered)

Обратите внимание, что вы не можете использовать методы Anon здесь, так как они просто называют 1, 2, 3 и т. Д., И единственным способом проверки на теп. Комплексное приложение

6
ответ дан 27 November 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: