有一个带有按钮的自定义控件。有一个外部 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 的解决方案很好,但它对我还不起作用。