как правильно использовать .each здесь? - PullRequest
4 голосов
/ 30 августа 2010

Это в основном для библиотеки, которую я строю.В этом модуле я попытаюсь создать вспомогательную библиотеку отладки, чтобы помочь мне во время отладки.

Мои проблемы здесь заключаются в том, что при вызове FDL.D.ListEvents() происходит несколько неловких вещей:

1) Если я включу достаточное количество вызовов _logEvent(), последние несколько перестанут закрывать свои группы на консоли, что делает его полностью нечитабельным.

2) Он "решает", что он перечислил меньше событий, чем на самом делеdid.

Когда я использую _logEvent(), например, только для мышиных событий, они перечисляют их вроде «правильно», или, по крайней мере, так, как я ожидаю, что функция будет работать,выявление и подсчет около 20 событий в DOM (хотя временной интервал определен как ноль, что довольно странно).

Видимо, я слишком опасен, чтобы публиковать изображения :( Редактировать:! Теперь я могу!

Вывод изображения:

Working ListEvents()

Когда я вызываю функцию с полным списком событий, я получаю вместо этого странный формат вывода:

Broken listing

Следующее будет автономной частью библиотеки (которую вы можете запустить), которая должна творить магию

var FDL = FDL || {};

// FIREBUG DEBUG LIBRARY

FDL.D = (function()
{
    function _logEvents(eventName)
    {
        var _arr = $(":visible");
        var _count = 0;

        console.groupCollapsed(eventName);

        _arr.each(function(idx)
        {
            var _el = this;
            var _id = _el.id;

            if(!_id){
                _id = _el.tagName;
            }

            var _ev = eval("_el." + eventName);

            if(_ev){
                console.log("%o\n" + _ev + "\n\n",$(this));
                _count++;
            }
        });

        console.log(_count + " " + eventName + " events");
        console.groupEnd();

        return _count;
    }

    return {
        ListEvents : function ()
        {
            var _start = new Date().getTime();
            var _count = 0;

            console.group("Events");

                _count += _logEvents("onblur");
                _count += _logEvents("onchange");

                _count += _logEvents("onclick");
                _count += _logEvents("ondblclick");

                _count += _logEvents("onerror");
                _count += _logEvents("onfocus");

                _count += _logEvents("onkeydown");
                _count += _logEvents("onkeypress");
                _count += _logEvents("onkeyup");

                _count += _logEvents("onmousedown");
                _count += _logEvents("onmousemove");
                _count += _logEvents("onmouseout");
                _count += _logEvents("onmouseover");
                _count += _logEvents("onmouseup");

                _count += _logEvents("onresize");
                _count += _logEvents("onselect");
                _count += _logEvents("onunload");

                var _diff = new Date(new Date().getTime() - _start).getSeconds();

                console.groupCollapsed("details");
                    console.log(_count + " events bound");
                    console.log(_diff + "s runtime");
                console.groupEnd();

            console.groupEnd();
        }
    };
})();

Я попробовал несколько идей, но не смог придумать правильное решение, чтобы сделать эти _logEvent() цепочки вызовов в ожидаемом порядке.Проблема в основном в том, что .each() называется асинхронным, и я полагаю, что это нарушает порядок выполнения моего кода.


Спасибо за ваш вклад!<3 stackoverflow </p>

EDIT: Я изменил вызовы groupCollapsed () на вызовы group (), и это действительно сработало.Теперь я сталкиваюсь с другой проблемой, как мне сделать так, чтобы она отображала привязки только один раз для каждого имени события, если связанная функция одинакова?

Например, если где-то у нас было $(":input").click(function(){alert("Clicked!");});

Мне бы хотелось, чтобы _logEvents("onclick") отображал функцию и селектор только один раз, но отображал, сколько раз он был связан.Например, если бы у нас было 4 входа, результат был бы:

jQuery (: input) Len: 1 function () {alert ("Clicked!");}

1 Ответ

1 голос
/ 07 сентября 2010

Проблема не в вашем коде, а в подпрограмме groupCollapsed.Пока используйте старую групповую процедуру, и все будет в порядке.Этот отчет об ошибке очень похож на вашу проблему.

...