以下jQuery代码如何工作?

时间:2009-06-09 20:45:53

标签: jquery

遇到代码,并想知道为什么这有效?

$.fn.appendVal = function(txt) { return this.each(function(){ this.value += txt; }); }; 

与简单相反:

 $('#sometextboxaspcontrol').value +=txt;

顺便说一句。我知道'简单'不是,但为什么?

7 个答案:

答案 0 :(得分:7)

这创建了一个jquery插件,基本上与底部示例做同样的事情。你是对的,底部应该是等价的(除了其他响应中提到的语法问题),但我猜测顶部片段是作为如何扩展jquery的一个例子而创建的,这最终会变得非常强大

它可以让你写:

$('#sometextboxaspcontrol').appendVal(txt);

您可以想象,可以在保留非常简单的公共API的同时扩展抽象。

答案 1 :(得分:3)

简单版本不起作用,因为该元素数组上不存在该属性。

jQuery对象本质上只是一个数组。你无法使用的原因:

$('#sometextboxaspcontrol').value +=txt;

是因为'value'在jQuery数组的上下文中不是有效选项。您需要使用方法,因为'value'属性应用于jQuery数组中的每个元素,即使该数组长度为一个元素。

答案 2 :(得分:1)

jQuery对象没有名为value的属性。要获取或设置jQuery对象的值,必须使用.val()。

所以$(...)。值不会得到或设置任何东西,因此不起作用。

答案 3 :(得分:1)

jQuery function$(...)不会直接返回该元素。它返回一个jQuery对象,该对象表示一个或多个匹配元素的列表*。

如果选择器表达式与单个元素匹配,则可以使用get()函数检索它并直接使用它:

$('#sometextboxaspcontrol').get(0).value +=txt;

如果选择器表达式与多个元素匹配,并且您希望独立地附加到每个元素的值,则需要以某种方式迭代元素。同样,您可以使用get()(没有索引)来获取原始元素数组。但是,您可以使用each()函数指定将在匹配列表中的每个元素的上下文中执行的函数。

如果这是你做了很多事情,你可以选择将自己的函数添加到jQuery对象本身(即创建一个插件)。通常,这将导致更小,更简单,更易读的脚本,并且重复代码更少。这就是这个例子的作用。 appendVal()函数被添加到jQuery对象中(它还返回jQuery对象(由each()函数返回)以允许您在“链”中调用其他jQuery函数,例如

$('#sometextboxaspcontrol').appendVal(txt).addClass('myClass');

答案 4 :(得分:1)

$('#sometextboxaspcontrol')[0] .value + = txt;

会工作吗?

原因是选择返回一个jquery数组而不是一个dom元素。

答案 5 :(得分:0)

更复杂的第一个示例还允许您一次将值附加到多个匹配元素...

答案 6 :(得分:0)

jquery返回一系列匹配对象。是的,即使您引用了唯一的元素标识符:

$('#foo').value = 'bar'
$('#foo').value != 'bar'

两个jQuery实际上都是包含相同元素的不同对象。所以这就是jquery扩展的来源,并将操作应用于每个所选元素。

使用firebug在javascript控制台周围戳。这将是启发。你可以在这里实验,因为他们使用jQuery。