- 以下是根據測試與Chrome 31或
- TL; DR:如何在this fiddle作品上嘗試來的代碼提交,但不確實在this one手工調用?有沒有更好的方法來做到這一點?
在回答a question asking for a way of validating an <input type="file">
against its accept
attribute(本機行爲將生成的文件對話框的工作提出默認過濾器,但它不執行),我想看看有什麼選項都是這個定製驗證融入HTML5的腳本Constraint validation。如何將自定義約束驗證作爲本機驗證事件流的一部分進行調用?
API的我最初的脫脂閱讀使我覆蓋本地checkValidity
方法,相信這將被默認稱爲每當瀏覽器認爲合適的驗證碼(jsFiddle):
void function enhanceFileInputTypeValidityCheck(){
var inputPrototype = document.createElement('input').constructor.prototype;
var nativeCheckValidity = inputPrototype.checkValidity;
// This is my custom validation function
function validateFileInputType(input){
var MIMEtype = new RegExp(input.accept.replace('*', '.\*'));
return Array.prototype.every.call(input.files, function passesAcceptedFormat(file){
return MIMEtype.test(file.type);
});
}
// My attempt at getting the behaviour to happen
inputPrototype.checkValidity = function enhancedCheckValidity(){
if(this.type === 'file' && this.accept && this.files && this.files.length){
if(!validateFileInputType(this)){
this.setCustomValidity('Please only submit files of type ' + this.accept);
return false;
}
}
return nativeCheckValidity.apply(this);
}
}();
當我的條件不滿足時,這會有效增強checkValidity
以返回false
,並且如果它們屬於本機行爲,但setCustomValidity
未按預期工作:它不會拋出任何異常,但不會顯示任何錯誤消息。關鍵是,我的return false
在checkValidity
不會阻止表單提交。
後一些擺弄我結束了這個事件處理程序,這與上述最後發佈的代碼沿實現期望的目的 - 即,防止根據提交的自定義標準,並反饋給用戶(jsFiddle):
$('input').on('change input', function(event){
this.checkValidity();
});
我很困惑這是怎麼發生的:根據記錄事件類型,change
將執行checkValidity
,但不會顯示消息;同時要提交表格確實執行我的setCustomValidity
,但不會記錄事件類型:但暗示這是一個input
事件,因爲這是處理程序正在監聽的唯一其他事件 - 但(這是它在真的奇怪),解除從change
(這是不工作),只留下input
作爲我的命令性回調觸發器doesn't prevent submission at all anymore。
由於綁定到change
和event
以觸發預期的行爲,因爲這兩個事件都沒有實際發生,所以我似乎仍然對將自定義驗證綁定到本機驗證流程的「正確」方式有所損失太習慣於被用於預期的用途。
解釋下列任何加分點:
- 爲什麼在一個空的輸入調用
checkValidity
時不我從我的自定義驗證console.log
任何反饋? - 爲什麼我從事件處理程序中的
console.log
得到任何反饋? - 如何執行代碼作爲
change
事件的回調不會觸發setCustomValidity
? - 什麼事件 - 如果不是
input
- 實際上是觸發我的setCustomValidity
? - 我可以在不覆蓋
checkValidity
的情況下生成相同的期望最終結果嗎?