我有一个JavaScript函数(如下所示),它从文本框插入数据库。我收到一个错误:
jquery val为null或不是行中的对象:
if($(this).val()。indexOf(“。”)< 0){
function LoadValues(mode, containers, emptyobj) {
var ele;
var obj = emptyobj;
var idx;
for(i=0;i<=containers.length-1;i++) {
switch(mode) {
case "add":
ele=$("#" + containers[i]).find("input,textarea,select").not("[type=hidden]");
break;
case "update":
ele=$("#" + containers[i]).find("input,textarea,select,hidden").not("[type=hidden][name^=__]");
break;
}
ele.each(function (x) {
if ($(this).attr("type") == "checkbox") {
if ($(this).attr("name") in obj) {
switch (typeof (obj[$(this).attr("name")])) {
case "boolean":
obj[$(this).attr("name")] = ($(this)[0].checked ? true : false);
break;
}
}
}
else {
if ($(this).attr("name") in obj) {
switch (typeof (obj[$(this).attr("name")])) {
case "number":
$(this).val((!$(this).val() ? "0" : $(this).val())); // <-- We have changed this line. It used to look like this: $(this).val(($(this).val()=="" ? "0" : $(this).val()));
if ($(this).val().indexOf(".") < 0) {
obj[$(this).attr("name")] = parseFloat($(this).val());
}
else {
obj[$(this).attr("name")] = parseInt($(this).val());
}
break;
break;
case "string":
obj[$(this).attr("name")] = $(this).val();
break;
case "object":
obj[$(this).attr("name")] = $(this).val();
break;
case "boolean":
obj[$(this).attr("name")] = ($(this).val() == "true" ? true : false);
break;
}
}
}
});
}
return obj;
}
我做错了什么?
答案 0 :(得分:2)
if($(this).val().indexOf(".")<0)
你不能在null值上调用indexOf,所以首先你必须检查返回值是否为空,然后使用indexOf。
要使其正常工作,请使用typeof:
$v=$(this).val();
if(typeof($v)=='string' && $v.indexOf(".")<0)
答案 1 :(得分:2)
您实际产生的错误实际上是从您引用行以上的行产生的。见这里:
$(this).val(($(this).val()=="" ? "0" : $(this).val()));
您实际做的是以下内容:
If (the value of this is an empty string) then:
Set the value to "0"
Else:
Keep the current value
问题在于您没有检查NULL值。如果$(this).val()
为NULL,那么当你真的想再次使用“0”时,null将被插回到“this”的值中,就像你有一个空字符串一样。
要修复,请替换为以下内容:
$(this).val((!$(this).val() ? "0" : $(this).val()));
这样做,而不仅仅是检查“this”的值是否为空字符串,看看它是否是“虚假”值,这基本上是任何不是填充字符串的值。如果$(this).val()
的内容是空字符串,或者为null或未定义,则将插入值“0”。
编辑 - 以下是您的固定代码应如下所示:
case "number":
$(this).val((!$(this).val() ? "0" : $(this).val())); // <-- We have changed this line. It used to look like this: $(this).val(($(this).val()=="" ? "0" : $(this).val()));
if($(this).val().indexOf(".")<0) {
obj[$(this).attr("name")]=parseFloat($(this).val());
}
else {
obj[$(this).attr("name")]=parseInt($(this).val());
}
break;
我没有在这里复制所有代码,只是需要更改的位。只需将其复制到代码中以case "number":
开头的位。
答案 2 :(得分:0)
我修改了我的代码:
if ($(this).val() == null) {
}
if ($(this).val().indexOf(".") <= 0) {
obj[$(this).attr("name")] = parseFloat($(this).val());
}
else {
obj[$(this).attr("name")] = parseInt($(this).val());
}
break;