1

对于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);
    }
});

编辑:问题是我每次都重新声明我的提交功能。

4

3 回答 3

3

问题是每次单击其中一个时,您都会向表单添加一个的提交事件处理程序。但第一个总是先开火。当您不声明 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改用。

于 2013-04-18T16:55:46.450 回答
1

每当您使用var时,您都在声明变量的范围。如果你省略它,那么 JavaScript 会假定最兼容的选项是全局的。技术术语是“吊装”。更准确地说,JavaScript 具有所谓的函数作用域,因此即使您在 for 循环中声明变量,JavaScript 也会将其“提升”到最近的函数的顶部。

于 2013-04-18T16:54:03.590 回答
0

您忘记声明 var 'that'。我认为您需要在“if”语句之前执行此操作

var that = this;
于 2013-04-18T16:48:51.350 回答