2013-03-12 29 views
2

望着文檔在這裏:http://docs.jquery.com/Plugins/Validation/Reference#Fields_with_complex_names_.28brackets.2C_dots.29 用於連接規則來輸入數組的語法是這樣的:jQuery驗證與未知的數組鍵

rules: { 
"user[email]": "email", 

但是在我的情況下,數組鍵是數值,並可能有任何價值,但我仍然希望將規則附加到領域。我動態添加輸入字段使用jQuery(key是一個全局變量):

$('a#addfield').click(function(e) 
{ 
    e.preventDefault(); 
    var data = '<p><input type="file" name="field['+key+']"></p>'; 
    $('div#inputcontainer').append(data); 
}); 

樣本HTML輸出:

<p><input name="field[19]" type="file"></p> 
<p><input name="field[22]" type="file"></p> 
<p><input name="field[25]" type="file"></p> 

我試圖定義這樣的規則:

rules: 
{ 
    'field[]': { 
     required: true, 
     extension: "pdf|doc|docx" 
    } 
} 

(從這個答案採取:jquery validate add rules for an array input編輯:這種建議的方式設置規則'field[]'不適用於驗證插件。請參閱下面的答案和評論。 )

但是當我嘗試添加其他文件類型時沒有驗證錯誤...有什麼建議嗎?

+0

從我記得,'jQuery.validate'不支持多個領域的驗證與像,同樣的名稱,而不是即使你刪除括號內的數字(發送給大多數後端語言時可以執行此操作)。嘗試使用'$('input')。rules(「add」,{required:true,extension:「pdf | docx?」})' – 2013-03-12 13:56:04

+0

謝謝!輸入字段會動態添加,因此我無法使用您的建議,因爲輸入不在DOM中。另外,我使用數組鍵來跟蹤表單中的許多內容,所以我不能只設置'name =「field []」',這將與驗證一起工作... – jtheman 2013-03-12 14:01:23

+0

使用'.rules(「add 「,{})'爲每個動態生成的字段。沒有其他選擇不涉及醜陋的黑客。 – 2013-03-12 14:02:24

回答

1

可以應用.rules("add", rules)到每個所生成的元素:

$(element).rules("add", { required:true, extension: "pdf|docx?" }); 

jQuery.validate確實提供了一種方法來驗證通過表單上設置的規則具有相同名稱(foo[]也不foo[N])元件(至少截至v1.11)。

添加動態規則還有其他一些方法,例如添加所需的支票而不調用.rules('add'),您可以在元素中簡單地使用class="required",並且驗證插件應該動態地選取它。

但是,沒有與extension選項的內置等價物,所以您必須爲所有輸入添加一個類並使用addClassRules創建您自己的類規則。這最終混合了一些行爲與HTML和可能的CSS雖然。


注意爲未來的讀者:既.rules('add')addClassRules不重複名稱的工作(例如foo[]),但如果名稱不完全相同(例如foo[index])這些做的工作是OP的情況。

我相信,隨着完全相同的名稱輸入是這個問題的題外話,但對於這些,你要麼必須與addMethod添加自己的驗證方法,或添加表單的提交處理程序內自己的驗證或嘗試這個related answer

+0

'」pdf | docx?「'中的問號是什麼? – jtheman 2013-03-12 14:09:34

+1

@jtheman在正則表達式中,'?'使得前面的字符是可選的。 – 2013-03-12 14:10:49

+0

酷解決方案!非常感謝!!! – jtheman 2013-03-12 14:11:31

1

我認爲給出的答案是正確的,但它也值得考慮創建一個結合你的兩條規則的類規則,然後給你的輸入這個類。這樣,您不必在每次向DOM動態添加新元素時調用addMethod。

$.validator.addClassRules("myinput", { required:true, extension: "pdf|docx?" }); 

HTML

<input name="field[19]" type="file" class="myinput"> 
<input name="field[22]" type="file" class="myinput"> 
<input name="field[25]" type="file" class="myinput"> 
+0

謝謝,這是我最初尋找的!但是現在我堅持以前的解決方案(沒人支付我再次更改它......):D +1給你! – jtheman 2013-03-12 15:04:13

1

編輯:我的答案被張貼在的問題,在沒有閱讀的意見,這是未知的原始版本,這些領域是創建動態。否則,它可以優選地只需添加規則創建的每個字段:

var myRule = { // save some code... put the common rule into a variable 
    required:true, 
    extension: "pdf|docx?" 
}; 

$('a#addfield').click(function(e) { 
    e.preventDefault(); 
    var data = '<p><input type="file" name="field['+key+']"></p>'; 
    $('div#inputcontainer').append(data); 
    $('[name="field['+key+']"]').rules("add", myRule); // add the rule to the new field 
}); 

(嵌套括號處理as per this answer。)

原來的答案如下:


接受的答案變你一半在那裏。

此外,我的答案不需要額外的class或對現有HTML結構的任何其他更改。這是所有的jQuery ...

上半部分是使用the built-in rules('add') method

$(element).rules("add", { 
    required:true, 
    extension: "pdf|docx?" 
}); 

下半年是讓應用於所有元素與名爲"field[19]""field[20]""field[21]"

您只需使用一個jQuery .each()一個jQuery "starts with" selector該方法。

$('[name^="field"]').each(function() { 
    $(this).rules("add", { 
     required:true, 
     extension: "pdf|docx?" 
    }); 
}); 

DEMO:http://jsfiddle.net/cWABL/

+0

請記住,字段是動態添加的。因此,如果您計劃在添加輸入時使用此代碼,則會多次查詢DOM,從而不必要地重新添加這些元素已存在的規則。 – 2013-03-12 15:30:32

+0

@FabrícioMatté,你是對的。但是,我的答案只適用於OP,就像它現在寫的那樣。如果OP可以顯示實際添加字段的代碼,也許可以提供更好的答案。 – Sparky 2013-03-12 15:38:26

+0

是的,您的答案可以幫助未來的訪問者發現類似於提問者代碼的問題。對於OP所具有的動態生成的輸入,只需將每個生成的輸入應用'.rules('add')'替代循環就可以了。 – 2013-03-12 15:41:30