为什么我无法获得jQuery对象的索引?

时间:2017-10-07 18:14:27

标签: jquery

为什么我无法在{ 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

&#13;
&#13;
-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;
&#13;
&#13;

2 个答案:

答案 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元素。