2016-06-16 43 views
0

我目前正在尝试使用jQuery来验证textarea或用户上传的文件。唯一不应该允许某人进入下一页的时间是当textarea和上传的文件isValid都为false时。对文件和文本区域的jQuery验证

这是我的代码有

$(document).ready(function() { 
$('#nomination-submit').click(function (e) { 
    var fileValid = false; 
    var textValid = true; 
    $('textarea').each(function() { 
     if ($.trim($(this).val()) == '') { 
      textValid = false; 
      //binds to onchange event of your input field 
      $('file').bind('change', function() { 
       var ext = $('#file').val().split('.').pop().toLowerCase(); 
       if ($.inArray(ext, ['pdf', 'doc', 'docx', 'rtf', 'txt']) == -1) 
       { $('#fileExtension').slideDown("slow"); $('#fileSize').slideUp("slow"); fileValid = true; } else { 
        var filesize = (this.files[0].size); 
        if (filesize > 4194304) 
        { $('#fileSize').slideDown("slow"); fileValid = false; } else { fileValid = true; $('#fileSize').slideUp("slow"); } 
        $('#fileExtension').slideUp("slow"); $('#textOrFile').slideUp("slow"); 
       } 
      }) 
     } 
    }) 
    if (fileValid == false && textValid == false) { 
     e.preventDefault(); 
     { $('#textOrFile').slideDown("slow"); } 
    } 
}) }); 

当我有像这样将允许用户去即使输入是无效的下一个页面。出于某种原因,当我这样做或嵌套的if函数时,它不能确保两者都不是错误的,这是我希望用户进入下一页的唯一时间。

+0

只是一个观察,但你直到他们尝试不改变你绑定事件提交。这可能比提交事件更好?另外''('input'[type ='file']')。on('change','not'$('file')'可能会更有效。 –

+0

@MarkSchultheiss原本这些是两个独立的验证代码片段。我需要合并这两段代码,这是它在我脑海中的意义,否则我会把它放在提交按钮之前,但似乎并不适合放置它 – race155

回答

0

创建动画验证的一些分离。

假设此标记:

<input type="submit" value="submit me" id="nomination-submit" /> 
<input type="file" id="fileMe" /> 
<textarea></textarea> 
<textarea></textarea> 
<textarea></textarea> 
<textarea></textarea> 

此代码:

$(document).ready(function() { 
    var validMinSize = 4194304; 
    var validTypes = ['pdf', 'doc', 'docx', 'rtf', 'txt']; 

    $('#nomination-submit').on('click submit', function(e) { 
    var fileValid = false; 
    var textValid = false; 
    var fileInput = $('#fileMe')[0]; 

    textValid = $('textarea').filter(function() { 
     return ($.trim($(this).val()) !== ''); 
    }).length == $('textarea').length; 

    var fileTypeValid = checkFileType(fileInput); 
    fileValid = fileTypeValid ? true : checkFileSize(fileInput); 
    var allInvalid = (!fileValid && !textValid); 
    if (allInvalid) { 
     e.preventDefault(); 
     $('#textOrFile').slideDown("slow"); 
    } 
    console.log("Check:" + fileTypeValid + ":" + fileValid + ":" + textValid + ":" + allInvalid); 
    }); 

    $('#fileMe').on('change', function() { 
    var fileInput = this; 
    if (checkFileType(fileInput)) { 
     $('#fileExtension').slideDown("slow"); 
     $('#fileSize').slideUp("slow"); 
    } else { 
     if (checkFileSize(fileInput)) { 
     $('#fileSize').slideDown("slow"); 
     } else { 
     $('#fileSize').slideUp("slow"); 
     } 
     $('#fileExtension').slideUp("slow"); 
     $('#textOrFile').slideUp("slow"); 
    } 
    }); 

    function checkFileType(fileInput) { 
    var fileValid = false; 
    var ext = fileInput.value.split('.').pop().toLowerCase(); 
    if (!(validTypes.indexOf(ext) === -1)) { 
     fileValid = true; 
    } 
    return fileValid; 
    } 

    function checkFileSize(fileInput) { 
    var fileValid = false; 
    fileValid = !!fileInput && !!fileInput.files[0] && !(fileInput.files[0].size <= validMinSize); 
    return fileValid; 
    } 
}); 

拨弄修改后的代码:https://jsfiddle.net/MarkSchultheiss/71Lufcf2/2/

+0

有多个文本我需要它来验证4个文本区域或上传一个文件 – race155

+0

这仍然遇到我之前遇到的同样的问题。验证不会过去验证文本框,所以如果我上传文件,它将不会允许我在页面上移动 – race155

+0

易于修复:将设置颠倒过来设置为'var textValid = false;'如果任何文本区域已填充,请将其设置为true。你需要所有的textarea被填充,这是一个小的变化,但这应该ge你开始了。 –