getelementbyid在外部js不工作的asp.net自定义控件
有一个按钮的自定义控件。有一个外部JavaScript文件试图附加一些事件到我的控制。像onclick事件在运行时添加到按钮。要做到这一点我用getelementbyid在外部js不工作的asp.net自定义控件
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的解决方案很好,但它还没有为我工作。
在.NET中,当控件嵌套在表单中时,控件的名称也会带上父母的名字。例如,名称为“ComboBox1”的对象在输出HTML时可能会变成“ctl00_content_ctl00_ComboBox1”。如果您需要在浏览器运行时通过其id来引用按钮,那么您可以检查生成的HTML代码并查看该按钮的最终名称,然后在JS中使用它。请注意,如果任何按钮父对象的名称发生更改,则该按钮的名称可能会更改。因此,这不是一个好的解决方案,尤其是当您在页面上可能有很多这些控件时。
有一些JavaScript框架,例如jQuery和Prototype,它们提供的工具可以让您更轻松地在DOM中查找对象并附加事件。
为自定义控件创建一个属性,该控件返回您需要在JavaScript中解决的按钮的客户端ID。
你的代码最终会看起来像这样:
内定制控件的代码背后:
public string SaveButtonID
{
get { return SaveButton.ClientID }
set {/*nothing*/;}
}
在JavaScript
var save = document.getElementById('<%=MyCustomControl.SaveButtonID%>");
编辑 在JavaScript固定错字。
谢谢jwatts!将检查建议的关键字。 – 2011-02-15 16:20:14
jwatt,你能指出一些可行的例子吗? – 2011-02-17 15:31:24