我正在编写一个验证表单字段的脚本。表单输入具有data-validate属性,该属性包含不同功能的CSV。我遍历包含数据验证值的所有输入,将这些值分离到一个数组中,并循环遍历该数组以调用相应的函数。我的问题是window[func]
未定义 - 我得到"无法读取属性'应用'未定义"信息。我究竟做错了什么?这是jsFiddle
<input type="text" name="first_name" data-validate="min_length[4]">
(function($){
var fields = [];
var i = 0;
$('[data-validate]').each(function(){
var rules = $(this).data('validate').split("|");
var label = $(this).parent().find('label').first();
fields[i] = {
name: $(this).attr("name"),
label: label.text(),
rules: rules,
element: $(this)
}
i++;
});
$.each(fields, function(key, field){
field.element.on('focusout', function(){
$.each(field.rules, function(key1, rule){
if(rule.includes("[")){
var rule = rule.match(/(.*?)\[(.*?)\]/);
func = rule[1];
var len = rule[2];
params = [field.element.val(), len];
} else {
func = rule;
params = [field.element.val()];
}
if(callFunc(func, params)){
field.element.addClass('is-valid').removeClass('is-invalid');
} else {
field.element.addClass('is-invalid').removeClass('is-valid');
}
});
});
});
})(jQuery);
function min_length(str, len){
return str.length > len;
}
function callFunc (func, arguments){
window[func].apply(null, Array.prototype.slice.call(arguments, 1));
}
答案 0 :(得分:0)
关于您遇到的具体错误,我根本没有从您的代码中获得该错误。但是,这是我通过一些测试(和修复)得出的结果:
1)您需要return
callFunc
中调用的函数的值,否则您将获得undefined
。另外,你没有传递正确数量的论点。
return window[func].apply(null, Array.prototype.slice.call(arguments));
2)您需要将len
参数转换为字符串中的数字:
return str.length > Number(len);
3)你的两个课程都被称为is-valid
:)
答案 1 :(得分:0)
我认为我做了一些改进,检查出来:
(function($){
window.min_length = function(str, len) {
return str.length > len;
}
function callFunc(func, arguments){
return window[func](...arguments);
}
var fields = [];
$('[data-validate]').each(function(){
var rules = $(this).data('validate').split("|");
var label = $(this).parent().find('label').first();
fields.push({
name: $(this).attr("name"),
label: label.text(),
rules: rules,
element: $(this)
});
});
$.each(fields, function(key, field){
field.element.on('input', function(){
$.each(field.rules, function(key1, rule){
if(rule.includes("[")){
var rule = rule.match(/(.*?)\[(.*?)\]/);
func = rule[1];
var len = rule[2];
params = [field.element.val(), len];
} else {
func = rule;
params = [field.element.val()];
}
if(callFunc(func, params)){
field.element.removeClass('is-invalid').addClass('is-valid');
} else {
field.element.removeClass('is-valid').addClass('is-invalid');
}
});
});
});
})(jQuery);
&#13;
input {
outline: 0;
}
.is-valid {
border: 1px solid green;
}
.is-invalid {
border: 1px solid red;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" name="first_name" data-validate="min_length[4]">
&#13;
一些问题:
callFunc(func, params)
调用的结果但是它
什么都不返回,即undefined
,所以你的条件总是如此
false
。您应该从min_length()
返回结果
callFunc()
。 is-valid
的jsfiddle。其中一个应该是is-invalid
。min_height
没有成为window
的属性。所以我
将它放在IIFE中并明确地将其添加到window
中
因为关闭而再次发挥作用。i
变量 - 您只能push()
个对象
进入阵列。...
运算符调用min_length
在callFunc
内而不是apply
内。focusout
。