Javascript函数破坏/变量被遗忘

时间:2014-08-08 10:18:43

标签: javascript jquery

很难在标题中描述问题,但基本上,我有一个功能,当点击一个按钮时,检查元素上的一堆属性,以显示/隐藏相关内容。

这一切都很有效,除非我在选择某个标签时尝试添加隐藏面板的额外功能。这是一个简单的if语句,我认为我没有遇到任何麻烦,但它有我见过的最奇怪的反应。

有3个主要选项卡,其中一个值为'mirror'的选项卡关闭了一组与我正在处理的控制器设计人员的模式相关的选项卡。单击“镜像”时,变量“dependsvar”设置正常,但它只会使用一次。以下是if语句的代码:

if (dependingvar !== undefined) {
jQuery('.' + dependingvar).children('.cdesign-toggle').first().trigger('click');
jQuery('.' + dependingvar).hide();
lastdepend = dependingvar;
} else {
jQuery('.' + lastdepend).show();
}

只会触发触发点击的第一行。隐藏该组的第二个不会运行。如果我交换它们,块将隐藏,但触发器不会运行。我已经检查了调试控制台,并且该变量在第一次运行时就会被取消分配。我不知道它发生了什么。

以下是完整代码: http://pastebin.com/6QncXf6c

由于依赖性,我不能真正做一个JSFiddle,但这里是HTML作为pastebin: http://pastebin.com/nePQbtjE

我真的不知道为什么会这样。一个重要的注意事项: 如果if语句放在底部以外的任何地方,它会破坏其余代码,取消设置变量,但只有在满足条件时才会这样做(dependsvar!== undefined)。

我希望这是一个愚蠢的错误,但有人能发现它吗?

2 个答案:

答案 0 :(得分:0)

我只是快速浏览了你的代码,但有些事情让我想起:

.trigger('click')以异步方式运行。事件处理程序将其设置为undefined(顺便使用null或其他东西 - undefined应仅用于未定义的变量。)

在下一行中,您再次引用dependingvar,但根据.cdesign-toggle click事件是否已经结束,dependingvar可能有一个价值或其他。不要直接引用dependingvar,而是尝试克隆它,因此您知道它的值不会在您的if语句中发生变化,这与以下内容类似:

if (dependingvar !== undefined) {
  var dependingvar_ = dependingvar; // or jQuery.clone(dependingvar) depending on the type of dependingvar
  jQuery('.' + dependingvar_).children('.cdesign-toggle').first().trigger('click');
  jQuery('.' + dependingvar_).hide();
  lastdepend = dependingvar_;
} else {
  jQuery('.' + lastdepend).show();
}

答案 1 :(得分:0)

您在函数外定义了dependingvar,因此它在全局范围内。您通过其他函数调用(在这种情况下通过调用children('.cdesign-toggle').first().trigger('click');)所做的每项更改也将在您当前的范围内生效。

此代码将演示此内容:http://jsfiddle.net/petervanderwal/r87b1f9k/1/

在函数内移动定义(在演示中注释掉),因此对click的其他调用不会改变相同的dependingvar