2013-04-18 2 views
1

Для currentUnknownBox, если я использую «var», ожидаемая функциональность не работает должным образом (currentUnknownBox становится первым щелчком элемента). Если я удалю var, он работает так, как ожидалось. Я предполагаю, что это имеет какое-то отношение к глобальному охвату. Может ли кто-нибудь объяснить это мне?Область Javascript - var vs global

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

EDIT: Проблема в том, я вновь объявить мою принять функцию каждый раз.

+0

Где определяется 'that'? –

+0

'currentUnknownBox', кажется, все в порядке, но что это такое? И почему существует также свойство currentUnknownBox' в переменной 'that' (ожидается в предложении else)? – Bergi

+0

, не связанный с вашей проблемой, но в размещении курсорных фигур JS имеет значение и, вероятно, не должен быть в порядке: http://stackoverflow.com/questions/3641519/why-results-varies-upon-placement-of-curly- braces-in-javascript-code –

ответ

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.

0

Вы забыли объявить var 'that'. Я думаю, что вам нужно сделать это прежде, чем «если» заявление

var that = this; 
+0

См. Редактирование, я думаю, что понял это –

+0

Где? Я не могу видеть, где вы обновляетесь. –

+1

См. [Ответ Дэна] (http://stackoverflow.com/a/16088927/363701). Этот код: 'jQuery ('# letter_input_form'). Submit (function() {...' запускается каждый раз, когда нажимается «.box.unknown', добавляет новый обработчик событий в' # letter_input_form'. –

1

Всякий раз, когда вы используете var вы объявляете область действия переменной. Если вы его опустите, то JavaScript предполагает самый совместимый вариант, который является глобальным. Технический термин: «hoisting». И чтобы быть более точным, JavaScript имеет так называемое функциональное масштабирование, поэтому даже если вы объявляете переменную внутри цикла for, JavaScript «поднимает» ее вверху ближайшей функции.