2

私はこれをグーグルで死に至らしめ、たくさんの「答え」を見つけましたが、どれも私には役に立たないので、賢い人が私に「決定的な」答えを与えることができるかもしれませんか?

私はJavascript関数を持っています:

function enableSaveLink() {
    document.getElementById('<%= btnSaveLink.ClientID %>').removeAttribute('disabled');
}  

これは正常に機能しますが、明らかに私のページで特定のコントロールを有効にするようにハードコーディングされています。私が欲しいのは、ページ上の任意のコントロールからこの関数を呼び出して、有効にしたいコントロールの名前を変数として渡すことができるようにすることです。したがって、理想的な世界では、私のJavascript関数は次のようになります。

function enableControl(ctl) {
    document.getElementById(ctl).removeAttribute('disabled');
}  

そして、私はそれをこのように呼ぶでしょう:

<asp:button id="btnTestButton" runat="server" Text="Click Me" onclientclick="enableControl('txtTestTextbox') />
<asp:button id="txtTestTextbox" runat="server" enabled="false />

コントロール名を渡す方法が機能しないことはわかっていますが、さまざまな方法で渡すことを試みましたが、どれも機能しません。これは、説明のためだけのものです。誰かが実際にこれを機能させる方法を教えてもらえますか?

4

4 に答える 4

3

コントロールのClientIDプロパティを使用する必要があります。

これは役立ちます:

<asp:button id="btnTest" runat="server" Text="Click Me" 
            onclientclick="enableControl('<%= lblTest.ClientID %>') />
于 2012-08-16T11:39:43.573 に答える
1

わかりました、私はそれをクラックしました。これを行うにはおそらく複数の方法がありますが、これはかなりエレガントです。

私のJavascript関数:

    function enableControl(ctl) {
        document.getElementById(ctl).removeAttribute('disabled');
    }

私のASP.NETマークアップ:

<asp:Button ID="btnTestButton" runat="server" Text="Click to enable" OnClientClick="enableControl('txtTestTextbox');" />
<asp:TextBox ID="txtTestTextBox" runat="server" enabled="false" ClientIDMode="Static" />

キーはClientIDModeプロパティです。これは、静的に設定すると、レンダリング時のコントロールのクライアント側IDがマークアップで指定したIDと一致することを意味します。ネーミングコンテナ内にある場合は、関数呼び出しで渡される変数にそれを含める必要がある場合があります。ClientIDModeの詳細については、こちらをご覧ください

とにかく、これは私のために働きます!みなさん、ご意見ありがとうございます。

于 2012-08-16T14:42:13.523 に答える
1

参照を使用しthisます(詳細はこちら):

<asp:button id="btnTest" runat="server" Text="Click Me" onclientclick="enableControl(this);" />

次に、スクリプトで:

function enableSaveLink(elem) {
    elem.removeAttribute('disabled');
}

ここでは、関数を呼び出しているオブジェクトへの参照を関数に渡しています。その後、DOM で属性を見つけるのではなく、要素に属性を設定することができます。


編集- 意図した使用法が何であるかを理解しました。クリックされたときに無効な要素からイベントを発生させようとしている場合、要素からこれを行うことはできません。他の有効な要素から処理する必要があります。クリックしたときに要素を無効にするが、クリックしたときに要素を有効にしない場合、上記の方法は正常に機能します。


編集- 私のコメントに添えるために、このような均一な構造がある場合 (つまり、すべての入力に対応するラベルまたはボタンさえある場合):

<div>
    <label onclick="activateSibling(this);">Input One:</label>
    <input type="text" />
</div>

これを試すことができます:

function activateSibling(label) {
    label.nextSibling.removeAttribute("disabled");
}

jQuery で私の概念を示すjsFiddleを作成しましたが、これは正常に機能しているようです。


編集- OK、最後のアイデア。カスタム属性はどうですか。target次のように、有効にする ID を含む属性をクリッカブル要素に追加できます。

<label target="active_me" onclick="activate(this);">Click to activate</label>

<input type="text" id="active_me" disabled="disabled" />

そしてあなたのスクリプト:

function activate(label) {
    var inputId = this.getAttribute("target");
    var input = document.getElementById(inputId);
    input.removeAttribute("disabled");
}

とはいえ、テクノロジーと少し戦っているように感じ始めており、ctrlInput.ClientID. しかし、これによりマークアップが少しきれいになり、まとめてバインドできる関数が得られると思います。

于 2012-08-16T11:39:49.767 に答える
0

ClientIDは、javascript でサーバー側の制御を取得するために使用されます。

var element=document.getElementById('<%=lblTest.ClientID%>');
于 2012-08-16T12:23:14.033 に答える