Как вернуть переменную с помощью jQuery для каждой функции

Это мой сценарий (упрощенный):

var $error = false;
//Check for errors
$('.required').each(function()
{
    var $error = true;
});
alert($error);

Как сделать так, чтобы приведенный выше код возвращал true в функции оповещения? Каждая функция выполняется 3 раза на моей странице, чтобы проверить наличие пустых полей. Но в приведенном выше предупреждении содержится false вместо true. Есть ли способ проанализировать переменную $error вне каждой функции, чтобы проверить, есть ли пустые поля после каждого цикла?


person Rens Tillmann    schedule 06.06.2013    source источник
comment
Если вы получили предупреждение false, значит, у вас нет элементов, соответствующих селектору .required. Попробуйте сначала это исправить :)   -  person gustavohenke    schedule 06.06.2013
comment
Связанный вопрос SO и Статья в Википедии.   -  person ajp15243    schedule 06.06.2013
comment
Спасибо за ссылку на статью!   -  person Rens Tillmann    schedule 06.06.2013


Ответы (5)


Отбросьте var внутри функции обратного вызова .each(), иначе вы определяете новую переменную в другой области.

var $error = false;
//Check for errors
$('.required').each(function()  //<-- start of new scope block
{
    var $error = true;  //<--defines new variable -- different from one above
});
alert($error);

Отбрасывая var, теперь он будет использовать переменную, определенную в блоке над ним.

var $error = false;
//Check for errors
$('.required').each(function()  
{
    $error = true;  
});
alert($error);
person epascarello    schedule 06.06.2013

Вы затеняете внешнюю переменную $error внутри обратного вызова .each(). Избавьтесь от var, чтобы вместо этого ссылаться на внешний:

var $error = false;
$('.required').each(function() {
    $error = true; // Now this refers to the `$error` declared above
});

Однако, если вы просто используете вызов .each, чтобы проверить, имеют ли какие-либо элементы класс .required, вы можете просто проверить .length:

alert($('.required').length > 0); // true or false depending if elements matched
person James Allardice    schedule 06.06.2013
comment
Дополнительная информация: Затенение переменных в Javascript - person Justin ᚅᚔᚈᚄᚒᚔ; 06.06.2013
comment
Всем большое спасибо! Сегодня снова узнал кое-что маленькое, но очень полезное! Плюс ваш второй способ намного проще. Я буду использовать его. Теперь я использовал: $(this).val()=='' вместо этого. - person Rens Tillmann; 06.06.2013

просто удалите внутреннее ключевое слово var

var $error = false;
//Check for errors
$('.required').each(function()
{
     $error = true;  // No Var Here
});
alert($error);

или используйте window в качестве пространства имен, как показано ниже

window.error = false;
//Check for errors
$('.required').each(function()
{
     window.error = true;  // No Var Here
});
alert(window.error);

Обратите внимание, что лучше разорвать цикл, если вы получили ошибку с return false - просто совет по производительности!

person Hilmi    schedule 06.06.2013

Вы $erro объявили locally и globally

var $error = false;
$('.required').each(function()
{
    $error = true;
});
person PSR    schedule 06.06.2013

Если вы хотите проверить, пусты ли тексты, вы можете использовать:

var $error = false;
$('input.anyclass').each(function()
{
    if($(this).val() == "")
    {
        $error = true;
    }
});
alert($error);
person Thiago Dias    schedule 06.06.2013