jquery toggleClass无法处理img元素

时间:2016-02-12 12:27:52

标签: javascript jquery ajax

我有两个按钮("批准","未批准")和一个加载微调器的图像。默认情况下,将显示“批准”按钮,并隐藏“取消批准”按钮和加载微调器图像。

当"批准"单击按钮我希望它消失,显示加载微调器,然后执行ajax请求。完成请求后,我希望加载微调器图像再次隐藏。如果ajax请求成功,我想要" Unapprove"按钮显示。如果ajax请求失败,我想要"批准"按钮再次显示。

我遇到的问题是,在完成ajax请求后,我的.always()方法会运行,但微调器图像不会被隐藏。这是一个例子:

https://jsfiddle.net/ebme6fjs/7/

如果我更改了我的ajax请求的url给我一个404 not found错误,那么这个过程就像它应该的那样:

https://jsfiddle.net/ebme6fjs/8/

有人知道为什么在我的第一种情况下spinner.toggleClass("hide");命令不在always()函数中运行吗?感谢。

更新: 我发现一个有趣的事情是,如果我在.always()函数中重新定义我的微调器变量,它可以在成功的ajax请求上正常工作:

https://jsfiddle.net/ebme6fjs/9/

如果您修改ajax网址以接收404,则同样会发生微调器不会消失的问题。

2 个答案:

答案 0 :(得分:2)

始终想要添加课程的情况下,请使用addClass,而不是toggleClass。在您的代码中,该类被切换两次:一次进入"始终"然后再次"失败"。所以它最终处于和以前一样的状态。

您将图片定位两次的原因是因为您正在定义otherButton,如下所示:

var otherButton = currentButton.siblings();

当你想要做的是:

var otherButton = currentButton.siblings('button');

toggleClass在您根据某些条件添加删除该类时非常有用。

答案 1 :(得分:1)

在您的代码中,您在hide回调和always()的图片中两次切换done()/fail()课程。

这是因为您定位了两个变量中的图片spinner & otherbutton

您应该将otherbutton定义如下:

var otherButton = currentButton.siblings("button");

不包括匹配集中的图像。

作为旁注,为了代码可读性,您应该使用addClass()/removeClass()而不是KWeiss的答案和btw,只在always()回调中设置显示/不显示元素的所有逻辑。