Javascript 为什么这个JQuery只有在console.log变量不正确时才起作用?

Javascript 为什么这个JQuery只有在console.log变量不正确时才起作用?,javascript,jquery,Javascript,Jquery,我对jquery比较陌生,每次单击都试图更改js手风琴上的上下箭头,不幸的是,我遇到了一个错误,只有当我将console.log记录为一个错误变量时,它才起作用。当我点击“embiggen(1)”时,是否有人对我可能做错的事情有任何指导,例如,如果它的手风琴id为1 围绕html还有一些其他问题,但具体来说,为什么只有当我使用console.log;,它才起作用 function arrowup(id){ $('#downarrow'+id).remove(); $('#dropdown'+id

我对jquery比较陌生,每次单击都试图更改js手风琴上的上下箭头,不幸的是,我遇到了一个错误,只有当我将console.log记录为一个错误变量时,它才起作用。当我点击“embiggen(1)”时,是否有人对我可能做错的事情有任何指导,例如,如果它的手风琴id为1

围绕html还有一些其他问题,但具体来说,为什么只有当我使用console.log;,它才起作用

function arrowup(id){
$('#downarrow'+id).remove();
$('#dropdown'+id).append('</a>');
$('#dropdown'+id).append('<i id="uparrow'+ id +'" class="icon-1 icon-chevron-up">');
}

function arrowdown(id){
$('#uparrow'+id).remove();
$('#dropdown'+id).append('</a>');
$('#dropdown'+id).append('<i id="downarrow'+ id +'" class="icon-1 icon-chevron-down">');
}


//Switches the arrows
function embiggen(id){

var up = $('#uparrow'+id).length;
if (up == 1){
    arrowdown(id);
    console.log(i see you);
}
var down = $('#downarrow'+id).length;
if (down == 1){
    arrowup(id);
}

}
函数箭头向上(id){
$('#向下箭头'+id).remove();
$(“#下拉列表”+id).append(“”);
$(“#下拉列表”+id).append(“”);
}
函数箭头向下(id){
$('#向上箭头'+id).remove();
$(“#下拉列表”+id).append(“”);
$(“#下拉列表”+id).append(“”);
}
//切换箭头
函数embiggen(id){
var up=$('#uparrow'+id).length;
如果(向上==1){
向下箭头(id);
console.log(我看到你了);
}
var down=$('#downarrow'+id).length;
如果(向下==1){
向上箭头(id);
}
}
错误的
console.log()
使其“工作”,因为该错误在进入第二条
if
语句之前中断了脚本的执行


解决真正的问题
down==1
始终为
true
。您应该使用
else
语句:

if ($('#uparrow'+id).length){
    arrowdown(id);
} else if ($('#downarrow'+id).length){
    arrowup(id);
}

理解它
down==1
始终为真,与
up==1
无关。以下是两种情况下用伪代码解释的逻辑:

var up = 1, down = 0;
if (up) { down = 1; up = 0; } //enters this block, down now is 1
if (down) { down = 0; up = 1; } //enters this block as down == 1

您只是在其中放置了一个
else
,以便在第一个if语句成功的情况下,执行流不会进入第二个if语句

if (up) {}
else if (down) {}

真/假价值观 为了解释我为什么在条件语句中使用隔离的
.length
:在JavaScript中,数字
0
是一个虚假的值,
1
是真实的,因此可以直接在
if
语句中使用,并根据内部算法逻辑对其进行解释。显然,如果您愿意,您可以
==1
,这一点虽然有点多余,但更清楚


一种可能更简单的方法 有点离题,但你的目标很可能以一种更容易的方式实现。我可能过于简化了您的逻辑,但根据您的意图,您可以在这两个类之间切换:

function embiggen(id) {
    $('#arrow'+id).toggleClass('icon-chevron-up icon-chevron-down');
}
这样,每次调用函数时,就不必再创建一个新的
#downarrow
/
#uparrow
元素。如果所述箭头附加了JS行为,您可以使用
If
语句检查要执行的逻辑。

错误的
console.log()
使其“起作用”,因为在输入第二个
If
语句之前,错误会中断脚本执行


解决真正的问题
down==1
始终为
true
。您应该使用
else
语句:

if ($('#uparrow'+id).length){
    arrowdown(id);
} else if ($('#downarrow'+id).length){
    arrowup(id);
}

理解它
down==1
始终为真,与
up==1
无关。以下是两种情况下用伪代码解释的逻辑:

var up = 1, down = 0;
if (up) { down = 1; up = 0; } //enters this block, down now is 1
if (down) { down = 0; up = 1; } //enters this block as down == 1

您只是在其中放置了一个
else
,以便在第一个if语句成功的情况下,执行流不会进入第二个if语句

if (up) {}
else if (down) {}

真/假价值观 为了解释我为什么在条件语句中使用隔离的
.length
:在JavaScript中,数字
0
是一个虚假的值,
1
是真实的,因此可以直接在
if
语句中使用,并根据内部算法逻辑对其进行解释。显然,如果您愿意,您可以
==1
,这一点虽然有点多余,但更清楚


一种可能更简单的方法 有点离题,但你的目标很可能以一种更容易的方式实现。我可能过于简化了您的逻辑,但根据您的意图,您可以在这两个类之间切换:

function embiggen(id) {
    $('#arrow'+id).toggleClass('icon-chevron-up icon-chevron-down');
}

这样,每次调用函数时,就不必再创建一个新的
#downarrow
/
#uparrow
元素。如果所述箭头附加了JS行为,您可以通过
If
语句检查要执行的逻辑。

它可以工作,因为当发生错误时,JavaScript会跳过函数体的其余部分

本例中的问题是函数
arrowdown()
创建
#downarrow+id
,使下一个条件真实,并调用函数
arrowdup()

您需要使用另一个分支,或者在对DOM进行更改后立即返回,否则会更改状态:

function embiggen(id) {
    if ($('#uparrow'+id).length) {
        return arrowdown(id);
    }
    if ($('#downarrow'+id).length) {
        return arrowup(id);
    }
    // ehm, something else happened?
}

它之所以有效,是因为当发生错误时,JavaScript会跳过函数体的其余部分

本例中的问题是函数
arrowdown()
创建
#downarrow+id
,使下一个条件真实,并调用函数
arrowdup()

您需要使用另一个分支,或者在对DOM进行更改后立即返回,否则会更改状态:

function embiggen(id) {
    if ($('#uparrow'+id).length) {
        return arrowdown(id);
    }
    if ($('#downarrow'+id).length) {
        return arrowup(id);
    }
    // ehm, something else happened?
}

那你自从结婚以来都做了些什么?这看起来基本上是一样的。我在上一个问题上得到的答案实际上是html问题,而不是js。。我需要把注意力集中在主要问题上。。我尝试了一大堆重写,但都没有用,其他问题中的所有建议都没有用。那么,自从你提出你的问题以来,你尝试了什么?这看起来基本上是一样的。我在上一个问题上得到的答案实际上是html问题,而不是js。。我需要把注意力集中在主要问题上。。我尝试了一大堆重写,但都没有用,还有其他问题中的所有建议。为什么投票被否决?使用
return
它将永远不会进入第二个
if
语句。虽然我更喜欢你的第一个版本带有
else
,+1作为替代方式
=]
@fabriciomatté谢谢,但你已经有了
else
,所以为了避免我们的答案看起来完全一样,我选择了一个替代方式:)为什么这被否决了?使用
返回
它将永远不会得到