是否有一个jQuery插件可以在选择器返回0项进行故障排除时写出来?
我知道使用.length
- 我从观察/分析/诊断级别看,而不是在代码级别。我不想把.length
放在我的代码上。
要输入代码,说我有一些复杂的选择器
$('#someComplex selectorHere')...
在代码的另一部分中,我想知道JQuery为该选择器返回0。
function onFailedSelector(selectorString) {
console.log("Failed to select "+selectorString);
}
在上下文中:由于ASP.NET的命名约定,我们引入了大量的错误,知道哪些错误会有所帮助。
答案 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();
如果你想做一些适当的讨厌的代码,你可以改变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)
不会记录任何内容,因此它不会提醒您选择器。
当你链接命令时,它也会多次记录一个选择器。
这是快速而肮脏的方法,因此可能有其他缺点:)
答案 4 :(得分:0)
http://sandbox.phpcode.eu/g/20c9c/1
<div><div></div></div>
<script>
alert($("div").length);
</script>
如果返回0,则表示没有div
答案 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/