JQuery val为null或不是对象

时间:2011-03-08 22:23:44

标签: javascript jquery

我有一个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;
}

我做错了什么?

3 个答案:

答案 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;