Jquery源码分析---DOM元素(下)
2010-09-14 13:36:29 来源:WEB开发网5.4.3 value
// 获得第一个匹配元素的当前值。
// 在 jQuery 1.2 中,可以返回任意元素的值了。包括select。如果多选,将返回一个数组,其包含所选的值。
// 设置每一个匹配元素的值。在 jQuery 1.2, 这也可以为select元件赋值
val : function(value) {
if (value == undefined) {//取值
if (this.length) {//如果当前jquery对象不是空集合
var elem = this[0];
//对select中option,我们会采用<option>xx</option>
//<option value=xx/>的形式
if (jQuery.nodeName(elem, 'option')) //value属性是否选中
return (elem.attributes.value || {}).specified ? elem.value: elem.text;
//处理select的value
if (jQuery.nodeName(elem, "select")) {
var index = elem.selectedIndex, values = [],
options = elem.options, one = elem.type == "select-one";
if (index < 0) return null;//没有选中选择项
// 不管是单选还是多选,找到所有的选中的选项
//对于单选而言,这样的判断实现减少for的次数,提高效率
//一般的实现都是直接采用for循环,可见jquery代码之优化
for (var i = one ? index : 0, max = one
? index + 1 : options.length;i < max; i++) {
var option = options[i];
if (option.selected) {
// 嵌套调用本函数,调用其option的部分进行处理,
//找到option的指定的值
value = jQuery(option).val();
if (one) return value; //单选直接返回值
values.push(value);//多选返回数组
}
}
return values;
} else//不要进行特殊的处理,但要去回车符
return (this[0].value || "").replace(/r/g, "");
}
//空集合时返回
return undefined;
}
if (value.constructor == Number)value += '';//转换成字符的形式
return this.each(function() {
if (this.nodeType != 1) return;//不是元素不处理。
//如果元素是radio|checkbox,设定的值为Array的形式
//那么本元素的value值或name值在数组中,就设定为选中。
if (value.constructor == Array
&& /radio|checkbox/.test(this.type))
this.checked = (jQuery.inArray(this.value, value) >= 0 || jQuery
.inArray(this.name, value) >= 0);
//如果元素是select,先把value转换成数组
//再判断其options的value在这个数组中不,在的话,就设定为选中。
else if (jQuery.nodeName(this, "select")) {
var values = jQuery.makeArray(value);
jQuery("option", this).each(function() {//给option设值
this.selected = (jQuery.inArray(this.value,
values) >= 0 || jQuery.inArray( this.text, values) >= 0);
});
if (!values.length) this.selectedIndex = -1;//如果空值 } else //其他的不要特殊处理,直接设值。
this.value = value;
});
},
5.4.4 content
Jquery的Content其实就是元素的所有的子元素的集合。
jQuery.each( {
contents : function(elem) {// iframe?就是文档,或者所有子节点
return jQuery.nodeName(elem, "iframe") ? elem.contentDocument
|| elem.contentWindow.document : jQuery
.makeArray(elem.childNodes);
}
}, function(name, fn) {// 注册到jQuery对象中去,可以调用同名方法
jQuery.fn[name] = function(selector) {
var ret = jQuery.map(this, fn);// 每个元素都执行同名方法
if (selector && typeof selector == "string")
ret = jQuery.multiFilter(selector, ret);// 过滤元素集
return this.pushStack(jQuery.unique(ret));// 构建jQuery对象
};
});
文章来源:http://jljlpch.javaeye.com/category/37744
更多精彩
赞助商链接