Javascript数组过滤器:获取正确的上下文
Javascript array filter: getting the context right
在尝试编写一些很棒的JS时,我遇到了一些奇怪的JS行为。我创建了一段代码来演示我的问题:
http://jsfiddle.net/CeyCy/
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
var images = $('.images').children();
var filtered = images.filter(function(i, image) {
console.log(this);
}, "abc");
});
</script>
</head>
<body>
<div class="options">
<div class="filters">
</div>
<ol class="pagination">
</ol>
</div>
<div class="results">
<ul class="images">
<li data-category="Zakelijk">Result 1</li>
<li data-category="Speels">Result 2</li>
<li data-category="Blogging">Result 3</li>
<li data-category="Zakelijk">Result 4</li>
<li data-category="Speels">Result 5</li>
<li data-category="Blogging">Result 6</li>
<li data-category="Zakelijk">Result 7</li>
<li data-category="Speels">Result 8</li>
<li data-category="Blogging">Result 9</li>
<li data-category="Zakelijk">Result 10</li>
<li data-category="Speels">Result 11</li>
<li data-category="Blogging">Result 12</li>
<li data-category="Zakelijk">Result 13</li>
<li data-category="Speels">Result 14</li>
<li data-category="Blogging">Result 15</li>
</ul>
</div>
</body>
</html>
好的,现在是我的问题。使用Array.filter方法时,将回调函数作为第一个参数,并将可选上下文作为第二个参数。正如你所看到的,我把"abc"作为上下文传递(当然,这很荒谬)。我希望我的控制台会抛出很多"abc",但它会打印jQuery元素!
有人能照一下这个吗?
谢谢,
Martijn
正如你所看到的,我把"abc"作为上下文传递(当然,这很荒谬)。我希望我的控制台会抛出很多"abc",但它会打印jQuery元素!
您使用的是jQuery的filter
,它没有上下文参数,而不是ES5的Array#filter
,因为您在jQuery对象上调用filter
,而jQuery对象不是数组(尽管它们提供了很多类似数组的功能,以及几个名称相似的"方法",包括filter
)。
三个选项供您选择:
makeArray
您可以使用jQuery的makeArray
将jQuery对象转换为数组,例如:
$(function() {
var images = $.makeArray($('.images').children());
var filtered = images.filter(function(i, image) {
console.log(this);
}, "abc");
});
更新的fiddle
proxy
/bind
或者,您可以使用jQuery的proxy
函数(或ES5的Function#bind
)将要传递的迭代器函数绑定到jQuery的filter
,这样它就会忽略jQuery提供的this
:
$(function() {
var images = $('.images').children();
var filtered = images.filter($.proxy(function(i, image) {
console.log(this);
}, "abc"));
});
将Array#filter
应用于jQuery对象
或者您可以将Array#filter
直接应用于jQuery对象:
$(function() {
var images = $('.images').children();
var filtered = Array.prototype.filter.call(images, function(i, image) {
console.log(this);
}, "abc");
});
因为Array#filter
是明确定义的,可以处理任何类似数组的东西,而不仅仅是Array
s。最后一种可能实际上是最有效的方法。Fiddle
相关文章:
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 如何从HTTP上下文对象中获取Post数据
- 绘制后获取Html5画布上下文数据
- 无法获取正确的淘汰绑定上下文
- Javascript数组过滤器:获取正确的上下文
- Firefox扩展:获取上下文菜单时的点击数据
- 从 JavaScript 获取上下文路径
- 在chrome扩展程序上下文菜单中获取选择DOM
- 如何在反应表中单击表行的列之一时获取表行的数据上下文
- 上下文菜单 JavaScript 无法获取所选文本,如果文本是输入标签/文本框
- 花式树:在右键单击上下文菜单中获取节点
- es6 获取/承诺上下文
- 在 $http.get 调用中获取服务上下文
- 从中继器循环中显示的子自定义元素获取正确的上下文.奥蕾莉亚
- 从火狐浏览器的上下文菜单中获取菜单项
- 选择2:获取格式选择以具有特定的上下文
- 从 Jquery 上下文菜单项的下拉列表中获取所选值,选择更改事件
- 如何在画布 html 中获取上下文 X 和 Y 位置5
- 尘埃 - 如何在循环中获取父上下文
- 从上下文获取变量到角作用域