2013-05-06 2 views
2

. Каждое утверждение будет влиять только на последний элемент. Я хотел бы предположить, что что-то делать с моей переменной логикой, но я не понимаю, как это имеет смысл, поскольку я нацеливание внутри этого заявления, используя $ (это)jQuery каждый влияет только на последний элемент

JS

$("form").each(function() { 
    $this = $(this); 
    $submit = $this.find('.submit'); 
    $textarea = $this.find('textarea'); 

    $submit.attr("disabled", "disabled"); 

    $textarea.keyup(function(){ 

     var validated = true; 

     var validated = ($textarea.val().length === 0) ? false : true; 

     if(validated) { 
      $submit.removeAttr("disabled"); 
     } else { 
      $submit.attr("disabled", "disabled"); 
     } 
    }); 
    $textarea.trigger('keyup'); 
}); 

Basic HTML:

<form> 
    <textarea rows="13"></textarea> 
    <button class="btn submit">Chercher</button> 
</form> 
<form> 
    <textarea rows="13"></textarea> 
    <button class="btn submit">Chercher</button> 
</form> 
+0

отлично работает для меня .. проверки этой скрипки: http://jsfiddle.net/NG4MP/ также. 'var validated = true' является избыточным – karthikr

+0

Я бы предложил использовать класс для вашего текстового поля. Делает весь код более простым. О, и префиксы JS-переменных с '$' довольно необычны. –

+1

@ lethal-guitar: префикс '' 'для переменных, содержащих объекты jQuery, довольно распространен. –

ответ

10

проблема заключается в том, что вы не объявляя эти переменные, поэтому они не являются локальными для функции, используется только одного переменной и заменяется каждым вызовом итератора функции (и если вы их нигде не объявили, y ou're падает до The Horror of Implicit Globals). Добавить var перед вашими переменными, чтобы сделать их специфическими для каждого вызова функции итератора, например:

$("form").each(function() { 
    var $this = $(this); 
    var $submit = $this.find('.submit'); 
    var $textarea = $this.find('textarea'); 
    // ... 
+1

спасибо, хорошо читали в вашем блоге наверняка :) – veksen

+0

@ user1732521: Добро пожаловать! Рад, что помогло, –

+0

У меня была эта плохая практика довольно долго, хе-х: P – veksen

1

Try это,

Script

var $this, $submit, $textarea, validated; 
$("form").each(function() { 
    $this = $(this); 
    $submit = $this.find('.submit'); 
    $textarea = $this.find('textarea'); 

    $submit.attr("disabled", "disabled"); 
    $textarea.keyup(function(event){ 

     validated = ($(this).val().length === 0) ? false : true; 

     if(validated) { 
      $(this).next().removeAttr("disabled"); 
     } else { 
      $(this).next().attr("disabled", "disabled"); 
     } 
    }); 
    $textarea.trigger('keyup'); 
}); 

Demo JShttp://jsfiddle.net/dhfBE/

+0

работает так же, как решение TJ Crowder, я не знал, что вы могли бы определить сразу несколько переменных. – veksen

2

Другой подход

$(document).on('keyup', 'form textarea', function(){ 
    var $this = $(this); 
    $this.next('.submit').prop('disabled', $this.val().length === 0) 
}); 
$('form textarea').trigger('keyup') 

Демо: Fiddle

+0

Гораздо чище, чем мой беспорядок, спасибо:) – veksen

0

Это должно быть возможным без каких-либо заданий и без явного each.

Try:

$("form textarea").on('keyup', function() { 
    $(this.form).find('.submit').attr("disabled", this.value.length === 0); 
}).trigger('keyup');