2013-08-24 3 views
1

Я пытаюсь использовать jquery для проверки формы с динамически созданной формой поля, чтобы гарантировать, что все поля ввода были заполнены до отправки. Я хотел бы скрыть ссылку отправки до тех пор, пока все поля не будут заполнены. Это то, что у меня есть до сих пор.Показать связь при заполнении всех полей ввода

$('form#form_id').change(function(e) { 
$(":input").each(function() { 
    if($(this).val() === ""){ 
     $("#showlink").hide(); 
     }else{ 
     $("#showlink").show(); 
     } 
    }); 
}); 
<div id="showlink"> 
     <a href="#" id="submitBtnId" onclick="addDuctClickHandler();" data-icon="check" data-role="button" data-inline="true" data-theme="b">Submit Final Test</a> 
</div> 

Я что-то пропустил?

+0

альтернативой является использование атрибута HTML5, для которого форма не может быть отправлена ​​до тех пор, пока все обязательные поля не будут заполнены в –

+0

J eroen прав, с осторожностью, что API-интерфейсы HTML5 недоступны во всех обтекателях. –

ответ

3

Это должно сделать трюк:

// check for the change of any input in the form 
$('#form_id :input').change(function(e) { 

    // if any of the values are blank hide the link 
    if ($('#form_id :input').map(function(idx, elem) { 
      if ($(elem).val() === "") return $(elem); 
     }).size() > 0) 
     $("#showlink").hide(); 
    else 
     $("#showlink").show(); 
}); 

Проблема с кодом является то, что он прикрепляет обработчик изменения в целом виде, а не из входов; Я даже не уверен, что повлияло на это. Также вы используете функцию each для итерации по всем входам всего документа, а не только по форме, и ссылка будет отображаться и скрываться для каждого из них в зависимости от их значения, поэтому в конечном счете ссылка будет видимой или скрытой на основе только на последнем значении, проверенном на итерации.

+0

Я установил js скрипку с вашим примером ... Не используйте его много, поэтому я думаю, что он настроен так, как описано. Это не совсем работает. http://jsfiddle.net/swJAq/ –

+0

@ChrisPilie Я обновил свой ответ, селектор был совсем немного, ему нужно было '$ ('# form_id: input')' вместо '$ ('form # form_id : ввод ') '. Также на вашем jsfiddle вам нужно добавить «style =» display: none «' в div showlink, чтобы он был изначально скрыт. – asymptoticFault

+0

спасибо! Я обновил скрипку. Он работает там, но все еще не в моем коде. Я не знаю, куда входит мой конфликт. Такая же проблема происходит с ответом Курта. –

0
if($(this).val().indexOf("")) 

или

if($(this).val.indexOf("")) 

Попробуйте использовать indexOf, чтобы увидеть, если пользователь ввел что-то

3

Вы собираетесь через каждое поле (с функцией each). Когда значение пустое, вы скрываете ссылку, но затем продолжаете работать над другими полями. Вы должны поместить инструкцию «break», когда значение пустое, чтобы прекратить дальнейшую обработку. Было бы даже лучше просто пройти все поля и поддерживать логический параметр. После цикла вы скрываете или показываете ссылку в зависимости от логического параметра.

Как это:

$('#showlink').hide(); // Assume form is incomplete 

$('form#form_id').change(function(e) { 
var complete = true; // Set start of boolean expression 

$(":input").each(function() { 
    complete = complete && $(this).val() !== ""; //If val is empty, the whole expression after the iteration will evaluate to false 
}); 

if(complete) { 
    $("#showlink").show(); 
} 
}); 
+0

Этот, похоже, работает в скрипке, но не работает над моим кодом. У меня может быть конфликт где-то еще ... http://jsfiddle.net/SP8TC/ –

+0

Не могли бы вы дать больше информации? Есть ли что-нибудь в вашем консольном журнале? –

0

Другой вариант в дополнение к @ asymptoticFault Ответим - использовать переменную для сохранения, если ссылка должна быть скрыта или нет:

$('form#form_id').change(function(e) { 
    var should_hide = false; 
    $(":input").each(function() { 
    if($(this).val() === ""){ 
     should_hide = true; 
     return false; // do not process each any more 
    } 
    }); 
    if (should_hide) { 
    $("#showlink").hide(); 
    } else { 
    $("#showlink").show(); 
    } 
}); 
0

хорошо вы можете сделать это:

var $allInputs = $("input:text"), 
    $button = $("#btnSubmit").hide(); 

$allInputs.change(function(){ 
    var isEmpty = $allInputs.filter(function(){ 
        return ($(this).val()==""); 
       }); 
    $button.hide(); 
    if(isEmpty.length == 0){ 
     $button.show(); 
    } 
}); 

рабочую скрипку здесь : http://jsfiddle.net/QwvtL/4/

Смежные вопросы