对于currentUnknownBox
,如果我使用“var”,预期的功能将无法正常工作(currentUnknownBox成为第一个单击的元素)。如果我删除var,它按预期工作。我假设这与全球范围有关。有人可以向我解释一下吗?
jQuery(".box.unknown").live('click',function()
{
var currentUnknownBox = this;
//if we are NOT on mobile, use jQuery UI dialog
if (!Drupal.settings.is_mobile)
{
jQuery("#letter-input-dialog").dialog();
jQuery('#letter_input_form').submit(function()
{
var letter = jQuery("#letter_input").val();
jQuery("#letter-input-dialog").dialog('close');
jQuery("#letter_input").val('');
that.validateAndSaveLetter(currentUnknownBox, letter);
//Do not let the form actually submit
return false;
});
}
else
{
var letter = prompt('Please enter a letter to use in your guess');
that.validateAndSaveLetter(that.currentUnknownBox, letter);
}
});
编辑: 问题是我每次都重新声明我的提交功能。
答案 0 :(得分:3)
问题在于,每次单击其中一个时,您都会在表单中添加 new 提交事件处理程序。但第一个将永远是第一个。当您不声明var时,您将覆盖第一个处理程序正在查看的变量。但错误是每次都添加一个新的处理程序。我会这样做:
var currentUnknownBox;
jQuery('#letter_input_form').submit(function()
{
var letter = jQuery("#letter_input").val();
jQuery("#letter-input-dialog").dialog('close');
jQuery("#letter_input").val('');
that.validateAndSaveLetter(currentUnknownBox, letter);
//Do not let the form actually submit
return false;
});
jQuery("#letter-input-dialog").dialog({autoOpen: false});
jQuery(".box.unknown").live('click',function(){
currentUnknownBox = this;
//if we are NOT on mobile, use jQuery UI dialog
if (!Drupal.settings.is_mobile)
{
jQuery("#letter-input-dialog").dialog('open');
} else {
var letter = prompt('Please enter a letter to use in your guess');
that.validateAndSaveLetter(currentUnknownBox, letter);
}
});
顺便说一句,.live
已被弃用。您应该使用.on
代替。
答案 1 :(得分:1)
每当您使用var
时,您都在声明变量的范围。如果省略它,则JavaScript假定最兼容的选项是全局的。技术术语是“hoisting”。更准确地说,JavaScript具有所谓的函数作用域,因此即使在for循环中声明变量,JavaScript也会将其“提升”到最近函数的顶部。
答案 2 :(得分:0)
你忘了声明var'那个'。 我想你需要在'if'语句之前做到这一点
var that = this;