2013-02-28 31 views
0

首先,我有点困惑,我无法立即在SO上找到答案。问题是关于代码风格。停止以优雅的方式链接jQuery

考虑这样一个例子:

$('input[type=text]').on('click', doSomething); 

如果在页面上没有投入,会发生什么?这个选择器的结果似乎是null,我们得到一个错误。

因此,我们必须使代码更大,丑陋:

var inputs = $('input[type=text]'); 

if (inputs) { 
    inputs.on('click', doSomething); 
} 

我爱jQuery和期待此次的解决方案更优雅和缩写形式。


UPDATE

这个问题的原因是prototype.js通过页面上的3方脚本包括在内。道歉,我应该在沙箱上张贴SO

+2

没有,这正是做*不*发生。你可以写'$(“foobarbaz”)。on('click',无论),它会一直工作(当然什么都不做)。 – Jon 2013-02-28 18:06:41

+4

尝试一下,然后再遵循你的逻辑! – Shef 2013-02-28 18:06:56

+3

原因是jQuery'$'对象没有被写入。道歉。我认为我们应该删除这个问题。谢谢大家! – Dan 2013-02-28 18:12:44

回答

7

jQuery选择总是会返回一个jQuery对象之前测试的问题,你将永远不会空。

$('#Not exist!').attr('foo', 'foo'); //no error, returns jQuery 

不像document.getElementById

document.getElementById('Not exist!') == null 
+0

jquery 1.7.2为我返回null,等待小提琴... – Dan 2013-02-28 18:08:56

+1

@丹,我敢打赌它不会......等待。 – gdoron 2013-02-28 18:10:12

+0

顺便说一句,这是我更喜欢jquery到mootools的最大原因。链中间没有随机的空元素错误。非常优雅地使用链接和空处理。 – Kristian 2013-02-28 18:11:50

1

没有错误,只是一个空的对象。你可以去用

$('input[type=text]').on('click', doSomething); 
2

的选择其实没有返回null如果它没有找到一个匹配,这是故意的,让链不断裂。这符合jQuery的“少写,多做”的格言。

我发了一个jsFiddle to illustrate this。在浏览器中打开开发人员工具并查看控制台。

var doSomething = function(){}; 
$('input[type=text]').on('click', doSomething); //No error 

//...because this: 

var obj = $('input[type=text]'); //is a jQuery object, even 
           //though there are no <input> elements 

console.dir(obj); //Inspect the console. you get: jQuery.fn.jQuery.init[0] 

我希望这是有道理的。你可以简单地做前者在你的例子:

$('input[type=text]').on('click', doSomething); 
0

我希望这个作品......

$('input[type="text"]').on('click', doSomething); 
+0

好吧,'text'和''text“'变体在CSS2 +或jQuery 1+中都可以正常工作。问题是,在某些时候,'''变量被'prototype.js':P覆盖,这不像jQuery那么好! – Dan 2013-03-01 10:34:33