getelementbyid во внешнем js не работает для asp.net-customcontrol

Иметь пользовательский элемент управления с помощью кнопки. Есть внешний файл javascript, который пытается прикрепить некоторые события к моему элементу управления. Подобное событие onclick добавляется во время выполнения к кнопке. Для этого я использую

var save = document.getElementById("btnExecute");  

Этот элемент управления вызывается со страницы aspx, к которой я прикрепил файл JS. Страница не будет работать, я читаю статьи, которые будут работать, если я изменю код на что-то вроде

var save = document.getElementById("<%= btnExecute.ClientID %>");  

но это работает, только если JS находится в файле aspx. Как заставить это работать для пользовательского контроля. Какие все шаги мне нужно выполнить, чтобы заставить работать ID на внешнем JS?

Пробное решение 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;
       }
   }

Отредактировано: все еще возвращается ноль. Может ли быть так, что JS запускается первым, а управления еще нет? Но это работает, если я передаю идентификатор элемента управления следующим образом:

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 хорошо, но у меня пока не работает.

2 ответа

В.NET, когда элементы управления вкладываются в форму, имена элементов управления также принимают имена их родителей. Например, объект с именем "ComboBox1" может закончиться как "ctl00_content_ctl00_ComboBox1" ко времени вывода HTML. Если вам нужно обратиться к кнопке по ее идентификатору во время выполнения браузера, то вы можете проверить сгенерированный HTML-код и посмотреть, каково окончательное имя кнопки, а затем использовать это в своем JS. Имейте в виду, что если имена любых родительских объектов кнопок изменятся, то имя кнопки может измениться. Таким образом, это не очень хорошее решение, особенно если у вас может быть много таких элементов управления на странице.

Существуют некоторые JavaScript-фреймворки, такие как jQuery и Prototype, которые предоставляют инструменты, позволяющие вам легче находить объекты в DOM и прикреплять события.

Создайте свойство для пользовательского элемента управления, которое возвращает идентификатор клиента кнопки, к которой вы должны обратиться в вашем JavaScript.

Ваш код будет выглядеть примерно так:

Внутри кода вашего пользовательского элемента управления:

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

В вашем JavaScript

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

РЕДАКТИРОВАТЬ Исправлена ​​опечатка в JavaScript.

Другие вопросы по тегам