0

テキストボックス、ドロップダウンリスト、整数を取りたいjavascript関数を作成しました。関数内で、テキスト文字列の長さとDDLの値を確認する必要があります。関数は以下のとおりです。

function CheckSearch(name, code, iMinSize) {
if (name.value.length < iMinSize && code.value === '') {
    alert('You must enter ' + iMinSize + ' letters or more when searching.');
    name.focus();
    return false;
}
else {
    return true;
}

}

関数は問題ないと思いますが、ASP.NETのButtonコントロールから呼び出すことができないようです。

これが私のボタンタグです:

<asp:Button ID="buttonSearch" runat="server" Text="Search" OnClick="buttonSearch_Click"
                OnClientClick="javascript:return CheckSearch('textBoxSearch','comboCodes', 3);" />

ボタンをクリックすると、ObjectExpectedエラーが発生します。

次の行のコードブレーク:

<input type="submit" name="ctl00$contentBody$buttonSearch" value="Search" onclick="return CheckSearch(document.getElementById(&#39;textBoxSearch&#39;),document.getElementById(&#39;comboCodes&#39;), 3);" id="contentBody_buttonSearch" /> 

エラーメッセージは次のとおりです。MicrosoftJScriptランタイムエラー:オブジェクトが必要です

助けてください。

ASP.NET4.0を使用しています

ありがとう

4

4 に答える 4

2

ページの下部に、さまざまなクライアントIDへの参照を追加します。例えば:

<script type="text/javascript">
  var buttonSearch  = document.getElementById('<%= buttonSearch.ClientID %>');
  var textBoxSearch = document.getElementById('<%= textBoxSearch.ClientID %>');
  var comboCodes    = document.getElementById('<%= comboCodes.ClientID %>');
</script>

次に、クライアントクリックでそれらのDOMオブジェクトを参照できます。

<asp:Button ID="buttonSearch" runat="server" Text="Search" OnClick="buttonSearch_Click"
                OnClientClick="return CheckSearch(textBoxSearch, comboCodes, 3);" />

これで、正しいDOMオブジェクトを渡したので、ハンドラーを変更する必要はありません。

if (name.value.length < iMinSize && code.value === '') {
    alert('You must enter ' + iMinSize + ' letters or more when searching.');
    name.focus();
    return false;
}

これを行う別の方法はClientIDMode、各コントロールでを静的に設定することです。

<asp:TextBox ID="textBoxSearch" runat="server" ClientIDMode="Static" />

これで、次のコマンドでこのテキストボックスの値にアクセスできます。

document.getElementById('textBoxSearch').value;
于 2012-05-01T15:43:22.370 に答える
0

CheckSearch関数を次のように変更したい場合があります。

function CheckSearch(name, code, iMinSize) {
    var textBox, comboBox; // use these variables
    textBox = document.getElementById(name);
    comboBox = document.getElementById(code);
    if (textBox.value.length < iMinSize && comboBox.value === '') {
        alert('You must enter ' + iMinSize + ' letters or more when searching.');
        textBox.focus();
       return false;
    }
    else {
        return true;
    }
}

現在、マークアップで文字列のみを渡していますが、関数はオブジェクトを期待しています。

編集: または、関数をそのままにして、マークアップを次のように変更することもできます。

編集2:文字列を変更しましたdocument.getElementById

<asp:Button ID="buttonSearch" runat="server" Text="Search" OnClick="buttonSearch_Click"
                OnClientClick="return CheckSearch(document.getElementById('<%= textBoxSearch.ClientID %>'),document.getElementById('<%= comboCodes.ClientID %>'), 3);" />

このようにして、id 文字列だけでなく、コンボとテキスト ボックスへの参照を渡します。

うまくいけば、最後の編集

あまり詳しく調べていませんでしたが、そのコードを実行したときに、あなたと同じように、一部の文字がエスケープされていないことに気付きました。そのため、次のようにレンダリングしていました。

document.getElementById(&#39;textBoxSearch&#39;)

(これは対処できますが、今はそれを行う時間がありません)

null関数はそのパラメーターを介してオブジェクトを見つけることができなかったため、オブジェクトを受け取るため、最終的にこれを行いました。

<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="textBoxSearch" runat="server" />
            <asp:DropDownList ID="comboCodes" runat="server" >
            <asp:ListItem Text=""></asp:ListItem>
            <asp:ListItem Value="1" Text="One"></asp:ListItem>
            <asp:ListItem Value="2" Text="Two"></asp:ListItem>
            <asp:ListItem Value="3" Text="Drei"></asp:ListItem>
            <asp:ListItem Value="4" Text="Four"></asp:ListItem>
            </asp:DropDownList>

            <asp:Button ID="buttonSearch" runat="server" Text="Search" OnClick="buttonSearch_Click"
                OnClientClick="return CheckSearch(3);" />
        </div>
    </form>
    <script type="text/javascript">

        function CheckSearch(iMinSize) {
            var textBox, comboBox; 
            textBox = document.getElementById('<%= textBoxSearch.ClientID %>');
            comboBox = document.getElementById('<%= comboCodes.ClientID %>');
            if (textBox.value.length < iMinSize && comboBox.value === '') {
                alert('You must enter ' + iMinSize + ' letters or more when searching.');
                textBox.focus();
                return false;
            }
            else {
                return true;
            }
        }
    </script>
</body>

関数自体でコントロールの参照を取得しているため、関数は他のコントロールを処理するのに十分な汎用性がないため、これは理想的ではないことに注意してください。そうは言っても、呼び出し時にコントロールへの参照があり、文字エスケープに問題がないため、Mike Christensen の例 (+1) に沿って何かを行うことをお勧めしますが、彼のコードはテストしていません。とも。

お役に立てれば

于 2012-05-01T15:41:35.833 に答える
0

問題は、ハードコードされたテキストを送信していることです: 'textBoxSearch','comboCodes'. ClientId を送信する必要があります。

OnClientClick="javascript:return CheckSearch('<%= textBoxSearch.ClientId %>','<%= comboCodes.ClientId %>', 3);" 
于 2012-05-01T15:42:27.220 に答える
0

このエラーの理由は、オブジェクトの ID を渡しているのではなく、オブジェクトを渡していないためです。解決策はあるかもしれません。

OnClientClick="return CheckSearch('<%= textBoxSearch %>','<%= comboCodes %>', 3);

OnClientClick に置き換えて、動作するかどうかを確認してください。

于 2012-05-01T15:38:10.853 に答える