Допустим, вам нужно присоединить некоторые функции JavaScript к пользовательскому элементу управления ASP.NET, который может быть несколько экземпляров на любой данной странице. Поскольку JavaScript имеет общее глобальное состояние, какие методы вы можете использовать, чтобы сохранить состояние и поведение клиента отдельно для каждого экземпляра элемента управления?





Что ж, главное, что вы можете сделать, это убедиться, что ваши функции JavaScript достаточно абстрактны и не связаны с конкретными экземплярами элементов управления HTML - пусть они принимают параметры, которые позволяют вам передавать различные экземпляры объектов.
JavaScript, который делает все, что вам нужно, должен существовать на вашей странице только один раз, независимо от того, сколько экземпляров пользовательского элемента управления у вас есть на данной странице, поэтому ваши функции должны игнорировать этот факт.
Без дополнительной информации о том, что вы пытаетесь сделать, я мало что могу предложить в качестве помощи; это будет зависеть от ваших обстоятельств.
Обновлено: Один из способов, которым я справился с конкретными аспектами этой проблемы, - это создать статическое свойство в пользовательском элементе управления (таким образом, это одна и та же переменная в нескольких экземплярах), которое отслеживает идентификаторы на стороне клиента различных элементов пользовательского элемента управления (пользователь control добавляет идентификаторы клиентов в этот список в событии контроль OnLoad); затем, в событии страницы OnPreRender (IIRC), отобразите их в переменной JavaScript, которую мой код знает, чтобы искать на клиенте и работать с ней. Не знаю, имеет ли это смысл, но может кому-то помочь ...
function <%=this.ClientID %>_myButton_onclick()
{
DoSomething();
}
и
<button id = "myButton" onclick = "<%=this.ClientID %>_myButton_onclick()">
Обратите внимание, что в этом случае элемент управления является обычным элементом управления HTML.
Основная проблема с этим кодом заключается в том, что теперь у нас есть куча функций-оберток, загрязняющих глобальное пространство имен - есть и другие проблемы, такие как тот факт, что это слишком похоже на ужасный встроенный код, похожий на классический ASP ... :) Но это вопрос предпочтений, не так уж плохо ...
Это может быть некрасиво, но он отвечает на вопрос ... Я предпочитаю использовать подход «сделать функции javascript универсальными и передать все», но для простых элементов управления это сработает.
@ Джейсон, изначально я подошел к этому так же в вашем ответе. Но, как и вы, я столкнулся с проблемой «как получить связанные элементы управления». Я думал о хранении связанных идентификаторов, как и вы, но чувствовал, что описанный выше подход самодостаточен и очевиден для обслуживания. Разработчики.
@Jason, Приведенный выше код также упрощает добавление обработчиков событий js и управление ими, поэтому вместо DoSomething () у вас будет <% = this.Attributes ["ControlClickEvent"]%>. Я ожидал, что основная часть кода будет во внешнем файле js ... это просто простая поддержка segway в него.
Я понимаю компромиссы, и их стоит рассмотреть, однако, как мне кажется, следует избегать загрязнения глобального пространства имен. Не только это, но я действительно не думаю, что метод, который я предлагаю, действительно сложнее поддерживать. Каждому свое!
@ Джейсон, я согласен с тобой больше, чем ты думаешь. По большей части это просто другой подход.
Если ваш элемент управления имеет более одной функции, вы можете поместить его во внешние файлы js и ссылаться на него.
this.Page.ClientScript.RegisterClientScriptInclude("searchcontrol.js","includes/searchcontrol.js");
Вы уверены, что вам не нужен рефакторинг? Не могли бы вы предоставить код?