如何正确使用.each在这里?

时间:2010-08-30 01:16:53

标签: javascript jquery firebug

这基本上是我正在建造的图书馆。在这个模块中,我将尝试构建一个调试助手库来帮助我调试。

我的问题是,当调用FDL.D.ListEvents()时会发生一些尴尬的事情:

  

1)如果我包含足够的_logEvent()个电话,最后几个会在控制台停止关闭他们的小组,这使得它完全不可读。

     

2)它“决定”列出的事件少于实际事件。

当我使用_logEvent()时,例如,仅使用mouseevents,它会将它们列为“正确”,或者至少以我希望函数工作的方式,显示和计算大约20个事件在DOM上(虽然时间跨度被确定为零,这有点奇怪)。

  

显然我太危险了   图片 :(   编辑:!现在我可以!

输出图片:


Working ListEvents()



当我用完整的事件列表调用该函数时, 我得到了这种奇怪的输出格式:


Broken listing



以下是lib的独立部分(你可以运行它)应该做的魔法

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

编辑:我使用group()调用更改了groupCollapsed()调用,但确实有效。现在我面临一个不同的问题,我应该如何制作它,只要绑定函数相同,它只为每个事件名称显示一次绑定?

例如,如果某个地方我们有$(":input").click(function(){alert("Clicked!");});

我希望_logEvents("onclick")只显示一次函数和选择器,但显示绑定的次数。例如,如果我们有4个输入,则输出为:

  

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

1 个答案:

答案 0 :(得分:1)

问题不在您的代码中,而是在groupCollapsed例程中。现在使用旧的“组”例程,你会没事的。这bugreport看起来很像你的问题。