用于检测失败选择器的JQuery插件

时间:2011-09-01 14:23:22

标签: jquery

是否有一个jQuery插件可以在选择器返回0项进行故障排除时写出来?

我知道使用.length - 我从观察/分析/诊断级别看,而不是在代码级别。我不想把.length放在我的代码上。

要输入代码,说我有一些复杂的选择器

$('#someComplex selectorHere')...

在代码的另一部分中,我想知道JQuery为该选择器返回0。

function onFailedSelector(selectorString) {
   console.log("Failed to select "+selectorString);
}

在上下文中:由于ASP.NET的命名约定,我们引入了大量的错误,知道哪些错误会有所帮助。

6 个答案:

答案 0 :(得分:7)

尝试一些AOP magic

如果您想尝试一下,我在jsfiddle上有一个working example

jQuery.aop.around({target: window, method: '$'},
  function(invocation) {
    var result = invocation.proceed();
    if (result.length == 0) {
      console.log('0 Result selector' + invocation.arguments[0]); 
    }
    return result;
  } 
);

我不确定你想要注销的是什么,但是这应该让你开始。 AOP插件网站在参考文献中有更多信息。

这应该将任何调用包装到$(“selector”),当你完成调试时,只需删除aop插件&你周围的片段。

答案 1 :(得分:4)

这是一个非常简单的插件:

(function ($) {
    $.fn.test = function () {
        var t = $(this);
        if (t.length == 0) {
            console.log("Failed to select " + t.selector);
        }
    };
})(jQuery);

// Usage
$('div').test();

JSFiddle Example

如果你想做一些适当的讨厌的代码,你可以改变jQuery源文件来做到这一点(v1.6.2的第25行):

var jQuery = function (selector, context) {
    // The jQuery object is actually just the init constructor 'enhanced'
    var result = new jQuery.fn.init(selector, context, rootjQuery);
    if (!result.length && selector && console) {
        console.log("Selector not found: " + selector);
    }
    return result;
},

可能不是最好的主意,绝对是你只能用来快速发现这些问题的东西。

答案 2 :(得分:2)

试试这个:

var devjQuery = function(){
    var ret = jQuery.apply(this, arguments);
    if (ret.length === 0 && typeof window.console != "undefined") {
        console.log("No Elements Selected.",arguments);
    }
    return ret;
}
devjQuery("div");
devjQuery("a");

现在你只使用devjQuery而不是$或jQuery。我猜你也可以使用noConflict,然后实际使用jQuery和$,这样你的代码就不必改变了。

编辑:

但是这只适用于$(),因为它可以处理其他dom遍历方法,你必须以相同的方式覆盖它们或覆盖它们所有使用的东西(例如jQuery.pushStack)。 / p>

答案 3 :(得分:2)

肮脏的,主要是工作的解决方案:

function $(arg) {
    if ( jQuery(arg).length == 0) {
        console.log(arg+" fails");
    }
    return jQuery(arg)
}

几乎正常工作,因为当只有部分失败时,$("#existing_elem, #not_existing_elem)不会记录任何内容,因此它不会提醒您选择器。 当你链接命令时,它也会多次记录一个选择器。 这是快速而肮脏的方法,因此可能有其他缺点:)

Demo

答案 4 :(得分:0)

http://sandbox.phpcode.eu/g/20c9c/1

<div><div></div></div> 

<script> 
    alert($("div").length); 
</script>

如果返回0,则表示没有div

http://sandbox.phpcode.eu/g/20c9c/2

答案 5 :(得分:0)

您可以在jQuery文件中放置一个调试语句,并在完成后将其删除。我不确定插件是否有足够的功率。编辑jQuery函数以在返回创建的对象之前计算结果数。

var jQuery = function( selector, context ) {
    var ret= new jQuery.fn.init( selector, context, rootjQuery );
    if(ret.length == 0 && arguments.length != 0 ) {
        console.log(ret.selector + " returned zero elements!");
    }
    return ret;
},

JSFiddle:http://jsfiddle.net/HQC5V/2/