0

再び問題が発生しました実際には、プロパティdisabled="disabled"を使用して無効にしたテキストボックスがいくつかある次のjspコードがあります。ここで問題となるのは、arraylistのデータベースから追​​加された値を反復するイテレータを使用して各テキストボックスのデータベースから取得する各レコードです。データベースが複数のレコードを返す場合は、そのチェックボックスを使用してテキストボックスを有効にできますが、データベースの結果セットが返すレコードは1つだけです。次に、テキストボックスを有効にできず、次のエラーがスローされます。メッセージ:'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());
}

%>

この問題をどのように解決しますか?私を助けてください!

4

2 に答える 2

0

TRブロックが1つしかない場合を除いて、それは魅力のように機能します。

その場合、.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% の確率でうまくいきます。ただし、上記のコードが失敗するのを見たことがありません (tr​​ue/false のアプローチに問題がありました)。

次: あなたが投稿したエラー メッセージには、非常に役立つ情報が含まれています: 元のコードの 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.previous前回クリックされたチェックボックスのインデックスを保持します.

最後に、ブロックには開き括弧または閉じ括弧がなくelse、余分な空白行があります。Else はブラケットなしで正常に動作しますが、1 行しか分岐しません。コードでは、この行は空白です。else を削除するか、括弧を追加してください。

PS: おそらくフィドルは状況を明確に把握するのに役立つでしょうか?


Teejay が指摘したように、一意の名前の場合、nodesList が渡されるのではなく、要素が直接参照されます。

于 2012-06-01T09:15:52.537 に答える