为什么这个javascript没有启用文本框使用复选框?

时间:2012-06-01 08:38:58

标签: javascript jsp

再次出现问题 实际上我有以下jsp代码,其中我有几个文本框,我通过使用属性disabled =“disabled”禁用。 现在问题是我将从每个文本框中的数据库获取的每个记录使用迭代器迭代从arraylist中的数据库添加的值。如果数据库返回多个记录然后使用该复选框我可以启用文本框但是如果数据库结果集只返回一个记录然后我无法启用文本框并在ERROR后抛出: 消息:'document.f1.chk'为null或不是对象 行:26 查尔:10 代码:0

<script type="text/javascript">

function enable()
{
    for(i=0;i<document.preapp.chk.length;i++)
        {
        if(document.preapp.chk[i].checked==true)

            {
            document.preapp.id[i].disabled=false;
            document.preapp.vname[i].disabled=false;
            document.preapp.comp[i].disabled=false;
            document.preapp.cont[i].disabled=false;
            document.preapp.wtm[i].disabled=false;
            document.preapp.intime[i].disabled=false;

            }
        else

            if(document.preapp.chk[i].checked==false)
            {
            document.preapp.id[i].disabled=true;
            document.preapp.vname[i].disabled=true;
            document.preapp.comp[i].disabled=true;
            document.preapp.cont[i].disabled=true;
            document.preapp.wtm[i].disabled=true;
            document.preapp.intime[i].disabled=true;
            }
        }
}


</script>

<CENTER><a href="../vm/form.jsp ">Back to Search</a></CENTER>
<form method="post" action="" name="preapp">

<table border="1" align="center" width="100%">
<%

Iterator itr;
try
{
ArrayList al=(ArrayList)request.getAttribute("sq");
int i=0;
for(itr=al.iterator();itr.hasNext();)
    {
i=i+1;


%>
        <tr>
            <td></td><td><input type="checkbox" name="chk"  onclick="enable(this)" ></td></tr></tr>
            <tr><td>Id</td><td><input type="text" name="id" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td>Visitor Name</td><td><input type="text" name="vname" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td>Comapny</td><td><input type="text" name="comp" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td>Contact</td><td><input type="text" name="cont" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td>Meeting Scheduled With</td><td><input type="text" name="wtm" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td>Entry Made On</td><td><input type="text" name="intime" value="<%=itr.next()%>" disabled="disabled" size="100%"></td></tr>
            <tr><td></td>
        </tr>

        <tr>


        </tr>

<%

    }

}
catch(Exception e)
{
e.printStackTrace();
System.out.println(e.getMessage());
}

%>

如何解决这个问题?请帮帮我!

2 个答案:

答案 0 :(得分:0)

它就像魅力一样,除非你只有一个TR块。

在这种情况下,.chk没有“length”属性!

您应该单独考虑这个案例:

function enable()
{

    if(document.preapp.chk.length == null)
    {

        disabledState = !document.preapp.chk.checked

        document.preapp.id.disabled=disabledState;
        document.preapp.vname.disabled=disabledState;
        document.preapp.comp.disabled=disabledState;
        document.preapp.cont.disabled=disabledState;
        document.preapp.wtm.disabled=disabledState;
        document.preapp.intime.disabled=disabledState;

    } else {


        for(i=0;i<document.preapp.chk.length;i++)
        {

            disabledState = !document.preapp.chk[i].checked

            document.preapp.id[i].disabled=disabledState;
            document.preapp.vname[i].disabled=disabledState;
            document.preapp.comp[i].disabled=disabledState;
            document.preapp.cont[i].disabled=disabledState;
            document.preapp.wtm[i].disabled=disabledState;
            document.preapp.intime[i].disabled=disabledState;
        }
    }
}

答案 1 :(得分:0)

一些建议:不要将元素的属性设置为true或false,请尝试使用setAttributeremoveAttribute方法:

document.preapp.id[i].disabled=true;
//replace with:
document.preapp.id[i].setAttribute('disabled','disabled');
//to enable:
document.preapp.id[i].removeAttribute('disabled');

你做事的方式在99.9%的情况下都很好。我没有看到上面的代码失败,(我遇到了真/假方法的问题)。

下一步:您发布的错误消息包含非常有用的信息:检查原始代码的第26行。你的代码片段中找不到'document.f1.chk',所以我无法在你的代码中检查拼写错误或其他可能的问题。

您也将元素传递给enable函数。为什么然后,你是否循环遍历所有元素,检查页面上的所有元素?

function enable(elem)
{
    var i = document.preapp.indexOf(elem);//
    if (elem.checked === true)
    {
        document.preapp.id[i].removeAttribute('disabled');
        //...
    }
    //functions have properties, exploit them:
    if (typeof enable.previous === 'undefined' || enable.previous === i)
    {
        enable.previous = i;
        return true;
    }
    document.preapp.id[enable.previous].setAttribute('disabled','disabled');
    //...
    enable.previous = i;
}

enable函数的最后一部分存储刚刚单击的复选框的索引,因此当之前单击enable函数时,无需再次遍历所有元素:enable.previous保存索引上次点击的复选框。

最后:else块没有开括号或右括号,并且还有一行额外的空格。其他工作正常没有括号,但只分支一行。在您的代码中,此行为空:要么删除else,要么添加括号。

PS:或许小提琴有助于清楚了解情况?


正如Teejay所指出的,在唯一名称的情况下,元素是直接引用的,而不是传递的nodesList。