为什么我无法在{
boolean check = false;
if(year < theDate.year)
{
return true;
}
if(year > theDate.year)
{
return false;
}
if(month < theDate.month)
{
check = true;
}
if(day < theDate.day)
{
check = true;
}
else
{
return false;
}
return check;
}
内获得hdjs
的索引? jdks
是一个jQuery对象,其中所有jdks
块都有错误。 id^=name
是一个ID以&#34; name&#34;开头的块。哪个有错误。
那么为什么我在console.logging索引时得到hdjs
?
-1
&#13;
function $errorObjectFunction() {
return $("div[id^=name]").map(function() {
if ($(this).find(":first-child").hasClass("error") == true || $(this).find(".field_error").length > 0) {
return $(this)
}
});
}
var $self = $("#self");
var jdks = $errorObjectFunction();
var hdjs = $self.parent().parent().parent();
console.log("index: " + jdks.index(hdjs));
&#13;
答案 0 :(得分:4)
this
而不是$(this)
最明显的问题是您在地图回调中返回$(this)
而不是this
。 $(this)
是一个问题(原谅双关语)因为稍后对返回的数组进行操作的jQuery#index
调用正在寻找一个Element对象,而不是一个jQuery对象。
返回this
而不是$(this)
:
function $errorObjectFunction() {
return $("div[id^=name]").map(function() {
if ($(this).find(":first-child").hasClass("error") == true ||
$(this).find(".field_error").length > 0) {
return this;
}
});
}
var outers = $(".outer");
(function() {
var others = outers.map(function() {
var $el = $(this);
if ($el.find(':first-child').hasClass('other') ||
$el.find('.inner-other').length) {
return $el;
}
});
// Checks if each element is instance of jQuery
console.log(Array.from(others.map((i, e) => e instanceof jQuery)));
// [ true, true, true ]
// This means that all of the elements are jQuery objects
})();
(function() {
var others = outers.map(function() {
var $el = $(this);
if ($el.find(':first-child').hasClass('other') ||
$el.find('.inner-other').length) {
return this;
}
});
// Checks if each element is instance of Element
console.log(Array.from(others.map((i, e) => e instanceof Element)));
// [ true, true, true ]
// This means that all of the elements are Element objects
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="outer" id="outer-1"><div class="inner">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-2"><div class="inner other">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-3"><div class="inner other">
<div class="text"></div><div class="inner-other"></div>
</div></div>
<div class="outer" id="outer-4"><div class="inner">
<div class="text"></div><div class="inner-other"></div>
</div></div>
filter
而不是map
下一个问题是,您正在使用jQuery#map
过滤使用jQuery#filter
更多的元素列表(更多内容如下)。
使用filter
而不是map
:
function $errorObjectFunction() {
return $("div[id^=name]").filter(function() {
if ($(this).find(":first-child").hasClass("error") ||
$(this).find(".field_error").length) {
return true;
}
});
}
var outers = $(".outer");
var others = outers.filter(function() {
var $el = $(this);
return ($el.find(':first-child').hasClass('other') ||
$el.find('.inner-other').length);
});
console.log(Array.from(others.map((i, e) => e instanceof Element)));
// [ true, true, true ]
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="outer" id="outer-1"><div class="inner">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-2"><div class="inner other">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-3"><div class="inner other">
<div class="text"></div><div class="inner-other"></div>
</div></div>
<div class="outer" id="outer-4"><div class="inner">
<div class="text"></div><div class="inner-other"></div>
</div></div>
在这个方向上的另一个优化是组合选择器:
function $errorObjectFunction() {
return $("div[id^=name]").filter(function(el) {
return $(el).find(":first-child.error, .field_error").length;
});
}
var outers = $(".outer");
var others = outers.filter(function(el) {
return $(el).find(':first-child.other, .inner-other').length;
});
console.log(Array.from(others.map((i, e) => e instanceof Element)));
// [ true, true, true ]
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="outer" id="outer-1"><div class="inner">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-2"><div class="inner other">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-3"><div class="inner other">
<div class="text"></div><div class="inner-other"></div>
</div></div>
<div class="outer" id="outer-4"><div class="inner">
<div class="text"></div><div class="inner-other"></div>
</div></div>
:has(selector)
选择器那就是说,你可以简单地使用jQuery :has(selector)
selector。
这将以较少的步骤提供与上述过滤器相同的结果,并允许jQuery优化选择。
使用:has(selector)
选择器,如下所示:
function $errorObjectFunction() {
return $('div[id^=name]:has(:first-child.error, .field_error)');
}
var others = $(".outer:has(:first-child.other, .inner-other)");
console.log(Array.from(others.map((i, e) => e instanceof Element)));
// [ true, true, true ]
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="outer" id="outer-1"><div class="inner">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-2"><div class="inner other">
<div class="text"></div>
</div></div>
<div class="outer" id="outer-3"><div class="inner other">
<div class="text"></div><div class="inner-other"></div>
</div></div>
<div class="outer" id="outer-4"><div class="inner">
<div class="text"></div><div class="inner-other"></div>
</div></div>
我在隐藏的片段中更改了一些内容,以便于阅读。您可以查看this JSBin demo,一起查看所有这些示例。
如果您错过了上述任何链接,我已经为您收集了这些链接:
答案 1 :(得分:2)
我认为map()
没有给你想要的东西。
由于您希望从数组中过滤元素,因此更容易使用filter()
而不是map()
。
function $errorObjectFunction() {
return $("div[id^=name]").filter(function() {
return ($(this).find(":first-child").hasClass("error") == true || $(this).find(".field_error").length > 0)
});
}
var $self = $("#self");
var jdks = $errorObjectFunction();
var hdjs = $self.parent().parent().parent();
console.log("index: " + jdks.index(hdjs));
// logs "index: 3"
你遇到map的问题是,返回$(this)
会使你的数组成为查询对象而不是dom元素的列表。我认为filter()
方法更好,但如果由于某种原因需要使用map()
,请使用:return this
来返回实际的dom元素。