【问题标题】:How to extend jquery.validate URL validation?如何扩展 jquery.validate URL 验证?
【发布时间】:2012-10-17 15:39:17
【问题描述】:

我需要用户能够创建部分 URL,而无需每次都输入完整的 URL。

例如,假设我计划将 url 设为www.example.com/areas/{userinput}/home。我希望用户能够在文本框中输入一些文本,并且我想验证它是一个有效的 URL。

网址验证器功能如下:

url: function(value, element) {
        return this.optional(element) || /giantregex/.test(value);
}

我尝试通过以下方式向验证器添加验证方法:

$.validator.addMethod("exturl", function(value) {
    return $.validator.methods.url.call($.validator, "http://www.example.com/areas/" + value + "/home");
});

但是,当验证表单并调用我的扩展时,我不断收到此错误:

Uncaught TypeError: Object function (d,a){this.settings=b.extend(true,{},b.validator.defaults,d);this.currentForm=a;this.init()} has no method 'optional' 

optional 看起来是 $.validator 对象上的一个方法,但我不知道如何调用验证器 url 方法。

【问题讨论】:

    标签: jquery-validate


    【解决方案1】:

    jQuery 验证插件 - v1.11.0

    jQuery.validator.addMethod("complete_url", function(val, elem) {
        // if no url, don't do anything
        if (val.length == 0) { return true; }
    
        // if user has not entered http:// https:// or ftp:// assume they mean http://
        if(!/^(https?|ftp):\/\//i.test(val)) {
            val = 'http://'+val; // set both the value
            $(elem).val(val); // also update the form element
        }
        // now check if valid url
        // http://docs.jquery.com/Plugins/Validation/Methods/url
        // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
        return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(val);
    });
    

    然后:

    $("#form1").validate({
        rules: {
            complete_url:true
        }
    });
    

    来自http://www.robsearles.com/2010/05/jquery-validate-url-adding-http/

    【讨论】:

    • if(!/^(https?|ftp):\/\//i.test(val)) { 这行被注释掉是因为 //
    • 您的代码丢失了this.optional(element)... 非常重要的东西。没有它,您不能将此字段留空,即使您希望该字段是可选的!
    【解决方案2】:

    我设法让它没有错误地工作,这是我使用的 JS 代码:

    $(document).ready(function(){
    
        function validateURL(value){
          // URL validation from http://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url
          var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
          var regex = new RegExp(expression);
          return value.match(regex);
        }
    
        $.validator.addMethod("urlvalidation", function(value, element) {
          return this.optional(element) || validateURL(value);
        }, "URL is not valid");
    
        $('#frm_validation').validate({
          rules : {
              urlvalidation : { urlvalidation : true }
          }
        });  
    
    });​
    

    您可以在 this JSFiddle 上看到它的实际效果。

    【讨论】:

    • 这仍然需要我复制正则表达式。必须可以从用户输入创建我的 url,然后验证它是一个有效的 URL,然后调用内部 URL validate 方法来验证我的格式化字符串。
    • 好的,我不明白要求是避免复制正则表达式。在那种情况下,你为什么不像return this.optional(element) || urlValidationFunction(value)那样调用你的URL验证函数呢?
    • 这正是我在问题中所做和概述的。我最终也遇到了问题中的错误。
    • 我编辑了我的答案,告诉我它是否满足您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多