我刚刚浏览了jQuery API,我对map()
& get()
方法。我知道我错了,但map()
方法看起来很像.each()
语句?除了文档说它返回一个新的jQuery对象。
我一直在玩jsfiddle试图让我的头围绕它,但我不是那里。 here是jsfiddle链接:
此处还有代码片段:
$.fn.equalizeHeights = function() {
var two = $(this).map(function(i, e) {
return $(e).height();
});
console.log(two);
console.log(two.constructor);
console.log(two.get());
console.log(two.get().constructor);
return this.height(Math.max.apply(this,two.get()));
}
$('input').click(function() {
$('div').equalizeHeights();
});
我看到他们正在使用原型扩展jQuery来创建一个名为equalizeHeights()
的函数。 $(this)
表示页面上所有“div”元素的选择器。 map()
调用遍历div数组中的每个项并返回其高度?但我感到困惑的是我正在登录控制台。
一个是object
,另一个是array
?
有人可以详细说明map()
和get()
在这段代码中做了些什么吗?
提前致谢。
答案 0 :(得分:54)
有两种不同的jQuery map()
函数:.map()
和$.map()
。他们执行类似的事情,但在不同的集合。您正在使用第一个表单,它执行以下操作:
$(this)
,这是.equalizeHeights()
函数被调用的任何内容...... $('div')
:页面上的所有<div>
元素(phew)。< / LI>
创建一个数组,其元素数量与调用.map()
的对象相同(页面上的所有div,请记住),其n th 元素由调用提供的回调 - 我将在一秒内到达目标jQuery对象中的n th 元素。在这种特殊情况下,该回调就是这个函数:
function(i, e) {
return $(e).height();
}
.map()
看起来像.each()
,但有一个关键区别:.each()
对集合中的每个元素执行操作;传递给.each()
的回调的返回值用于确定迭代是否继续。.map()
还对集合中的每个元素执行操作,但回调的返回值用于生成.map()
返回的类数组对象中的元素。你还和我在一起吗?
jQuery obects是类似数组的,但它们不是数组!在.get()
调用结束时调用.map()
的原因是将该jQuery对象转换为真正的数组。该数组的元素是回调返回的值。
此函数将页面上每个<div>
的高度设置为最高<div>
的高度。方法如下:
$('input').click(function() { // bind a click listener to every <input> element
$('div').equalizeHeights(); // ...that will call the equalizeHeights() fn
// on all <div> elements when fired
});
因此,查看equalizeHeights()
定义:
$.fn.equalizeHeights = function() {
// construct an array that contains the height of every <div> element
var two = $(this).map(function(i, e) {
return $(e).height();
});
return this.height( // set the height of element <div> element to...
Math.max.apply( // the largest value in...
this,two.get() // the array of height values
)
); // ...and finally, return the original jQuery object to enable chaining
}
constructor
业务呢?正如您所发现的,是,一个是对象(一个jQuery对象),另一个是数组。这就是为什么你需要.get()
调用将类似数组的对象变成Math.max()
可以理解的东西。
不是查看constructor
属性,而是可以使用更多jQuery来确定您正在查看的内容:
console.log(two.jquery); // the version of jquery, something like "1.4.4"
console.log($.isArray(two)); // is it a plain old JS array? false
console.log(two.get().jquery); // undefined! it's just an array.
console.log($.isArray(two.get())); // true
更好的方法是查看调试器内部的实际对象,而不仅仅是console.log()
。这样,您可以看到整个对象图,其所有属性等。
答案 1 :(得分:5)
map
遍历jQuery对象并将函数应用于每个元素。每个调用的返回值都会添加到数组中。然后将该数组包装到jQuery对象中并返回。
get
返回一个包含jQuery对象中每个元素的数组。这意味着它基本上解包了map
返回的选择并获得了一个普通的JS数组。
在您的示例中,map
创建一个包含每个元素高度的选择。然后,在其上调用get
,以便本机JS函数Math.max
可以理解它。然后this.height()
将选择中每个元素的高度设置为数组中的最大值。
答案 2 :(得分:3)