0

再次遇到问题实际上我有以下 jsp 代码,其中我有几个文本框,我通过使用属性 disabled="disabled" 禁用了这些文本框。现在的问题是我将使用迭代器从每个文本框中的数据库中获取的每条记录,该迭代器迭代从数组列表中的数据库添加的值。如果数据库返回多条记录,则使用该复选框我可以启用文本框,但如果数据库结果集仅返回一条记录然后我无法启用文本框并抛出以下错误:消息:'document.f1.chk'为空或不是对象行: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());
}

%>

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

4

2 回答 2

0

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

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

您应该单独考虑这种情况:

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;
        }
    }
}
于 2012-06-01T08:41:55.650 回答
0

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

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函数的最后一段存储了刚刚被点击的checkbox的索引,这样当之前已经点击了enable函数时,就不需要再循环遍历所有元素:enable.previous保存上次点击的checkbox的索引.

最后:该块没有左括号或右括号else,并且有一行额外的空格。其他没有括号也可以正常工作,但只分支一行。在您的代码中,这一行是空白的:要么删除 else,要么添加括号。

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


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

于 2012-06-01T09:15:52.537 回答