ボタン付きのカスタム コントロールがあります。コントロールにいくつかのイベントをアタッチしようとする外部 JavaScript ファイルがあります。onclick イベントと同様に、実行時にボタンに追加されます。そうするために私は使用します
var save = document.getElementById("btnExecute");
このコントロールは、JS ファイルを添付した aspx ページから呼び出されています。ページが機能しません。コードを次のように変更すると機能するという記事を読みました
var save = document.getElementById("<%= btnExecute.ClientID %>");
ただし、JS が aspx ファイル内にある場合にのみ機能します。カスタム コントロールでこれを機能させる方法。外部 JS で ID を取得するには、どのような手順を踏む必要がありますか?
Ajax81 のソリューションを試してみました: コードが追加されました
namespace MyCompositeControl
{
public class MyGrid : CompositeControl
{
public string ButtonClientID
{
get { return btnExecute.ClientID; }
set { }
}
protected override void CreateChildControls()
{
#region Execute Button
btnExecute.ID = "btnExecute";
btnExecute.Text = "Execute";
btnExecute.Click += new EventHandler(_button_Click);
Controls.Add(btnExecute);
#endregion
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string jsResourceName = "MyCompositeControl.Scripts.ControlScriptLibrary.js";
ClientScriptManager cs = this.Page.ClientScript;
cs.RegisterClientScriptResource(typeof(this,GetType()), jsResourceName);
}
}
上記のコードでわかるように、ボタンは動的に追加されます。
ControlScriptLibrary.js
function attachEvents()
{
//var save = document.getElementById("btnExecute");
var save = document.getElementById("<%=MyGrid.ButtonClientID%>");
if(save!=null)
{
save.onclick = onSaveAction;
}
}
編集: それでも null を返します。JS が最初に実行され、コントロールがまだ存在しない可能性がありますか? しかし、これは、次のようにコントロール ID を渡すと機能します。
function MyController(executeButtonID, onSaveEventHandler)
{
function attachEvents()
{
//var save = document.getElementById("btnExecute");
var save = document.getElementById(executeButtonID);
if(save!=null)
{
save.onclick = onSaveAction;
}
}
}
コントロールの RenderContent メソッドには、次の JavaScript コードがあります。
var myController = new MyController(this.btnExecute.ClientID, onSaveEventHandler);
コントロールにさらにボタンがあり、JS でイベント処理が必要な場合、このアプローチは強制終了します。Ajax81 のソリューションは素晴らしいですが、まだうまくいきません。