11

由于某种原因,当我使用异步请求时未显示 html5 验证消息。

在这里你可以看到一个例子。

http://jsfiddle.net/E4mPG/10/

setTimeout(function() {                
  ...
  //this is not working
  target.setCustomValidity('failed!');                
  ...
}, 1000);

未选中复选框时,一切都按预期工作,但选中时,消息不可见。

有人可以解释应该做什么吗?

4

1 回答 1

5

我想通了,原来 HTML5 验证消息只会在表单提交过程中弹出。

这是我的解决方案背后的过程(检查超时时):

  1. 提交表格
  2. 设置forceValidation标志
  3. 设置超时功能
  4. 调用超时函数时,重新提交表单
  5. 如果forceValidation设置了标志,则显示验证消息

基本上执行两次提交,第一次由按钮触发,第二次在调用超时函数时触发。

jsFiddle

var lbl = $("#lbl");
var target = $("#id")[0];

var forceValidation = false;

$("form").submit(function(){
    return false;
});

$("button").click(function (){                
    var useTimeout = $("#chx").is(":checked");         

    lbl.text("processing...");
    lbl.removeClass("failed");
    target.setCustomValidity('');    
    showValidity();     

    if (forceValidation) {
        forceValidation = false;
        lbl.text("invalid!");
        lbl.addClass("failed");
        target.setCustomValidity('failed!');
        showValidity();
    } else if (useTimeout) {
        setTimeout(function () {
            forceValidation = true;
            $("button").click();
        }, 1000);
    } else {
        lbl.text("invalid without timeout!");
        lbl.addClass("failed");
        target.setCustomValidity('failed!');
        showValidity();            
    }
});

function showValidity() {                    
    $("#lbl2").text(target.checkValidity());
};

我在 Chrome 版本 25.0.1364.172 m 上运行。

于 2013-03-22T13:01:01.320 回答