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中查找对象并附加事件。

+0

谢谢jwatts!将检查建议的关键字。 – 2011-02-15 16:20:14

+0

jwatt,你能指出一些可行的例子吗? – 2011-02-17 15:31:24

为自定义控件创建一个属性,该控件返回您需要在JavaScript中解决的按钮的客户端ID。

你的代码最终会看起来像这样:

内定制控件的代码背后:

public string SaveButtonID 
{ 
    get { return SaveButton.ClientID } 
    set {/*nothing*/;} 
} 

在JavaScript

var save = document.getElementById('<%=MyCustomControl.SaveButtonID%>"); 

编辑 在JavaScript固定错字。