我已经编写了大量的Javascript,主要是使用JQuery,但我很难接受一些非常简单的事情。
在下面的代码中(也找到了here),我只想在某些逻辑中使用twoExists()
函数的布尔返回值。我不知道为什么会发生这种情况,但它直观地起作用。如同,如果我切换逻辑,我得到我想要的结果。
<html>
<p>One</p>
<p>Two</p>
<p>Three</p>
<p>Four</p>
<strong></strong>
</html>
var myJS = {
twoExists: function() {
$("p").each(function() {
if($(this).text() == "Two") {
return true;
}
});
return false;
},
foo: function() {
if(myJS.twoExists()) {
$("strong").text("Found two");
}
else {
$("strong").text("Did not find two");
}
}
bar: function() {
if(! myJS.twoExists()) {
$("strong").text("Found two");
}
else {
$("strong").text("Did not find two");
}
}
}
myJS.foo(); // result: <strong>Did not find two</strong>
myJS.bar(); // result: <strong>Found two</strong>
答案 0 :(得分:5)
我认为这可能会发生,因为jquery中的每个循环都会返回。 return true
的工作方式类似于普通js循环中的continue
语句,我认为它不会从twoExists函数返回 - 相反它只是从当前迭代跳转到下一个迭代。也许试试这个:
twoExists: function() {
var found = false;
$("p").each(function() {
if($(this).text() == "Two") {
found = true;
}
});
return found;
},
答案 1 :(得分:2)
当你从每个返回true时,你将从回调返回,而不是父函数:
var flag = false;
$("p").each(function() {
if($(this).text() == "Two") {
flag = true;
}
});
return flag;
答案 2 :(得分:1)
正如其他答案所提到的,返回的是each
回调函数的返回值,而不是 twoExists 函数。要解决此问题,您还可以使用简单的for
循环:
twoExists: function () {
var p = document.getElementsByTagName('p'),
l = p.length;
for (var i = 0; i < l; i++)
if (p[i].textContent === 'Two') return true;
return false;
}
答案 3 :(得分:0)
由于您已经在使用JQuery,您还可以利用高级选择器并节省一些工作:
twoExists: function () {
if ($("p:contains(Two)").length) {
return true;
}
return false;
}
其他答案可以很好地了解您当前的行为。您当前的return true;
正在从回调返回到.each
,而JQuery只会转到下一个元素,因此您的twoExists
函数将始终返回false。