Как найти динамически сгенерированный HTML-элемент?

Мне нужно получить клиентский экземпляр RadComboBox (или недавно выбранное значение RadComboBox), когда моя RadGrid выходит из режима редактирования, чтобы я мог отправить измененное значение обратно на сервер.

Проблема в том, что идентификатор объекта на стороне клиента всегда меняется. Кроме того, RadComboBox не создаются во время выполнения - они создаются только после того, как пользователь дважды щелкает определенную строку моей RadGrid. Следовательно, такой синтаксис, как

var SundayLoc = $find("<%= FieldOpsScheduler_ctl00_ctl05_RCB_SunLocale.ClientID %>");

равно FAIL. Пока я не начал получать изменения значений, мне удавалось уйти от этого:

var SundayLoc = $find("FieldOpsScheduler_ctl00_ctl05_RCB_SunLocale");

Это отлично работало каждый раз, пока я не добавил несколько объектов-разделителей строк, которые теперь заставляют "ctl05" идентификаторов всегда изменяться в зависимости от того, какую строку пользователь переводит в режим редактирования. Я пробовал использовать все способы получения этого объекта и его ценности, но безуспешно.

Я собирался попробовать использовать регулярные выражения, пока не прочитал ответ вики сообщества от bobince по адресу RegEx сопоставляет открытые теги, за исключением автономных тегов XHTML, привел меня к осознанию того, что соблазн синтаксического анализа HTML с помощью регулярных выражений - это работа нечестивого порождения сатаны (это и после исследования я пришел к выводу, что регулярные выражения мне, вероятно, не помогут).

В любом случае, если бы кто-то мог подбросить мне несколько идей, я был бы очень признателен. Заранее спасибо.


person KSwift87    schedule 22.07.2010    source источник


Ответы (2)


  • создать какой-то список на стороне сервера, чтобы отслеживать идентификаторы управления
  • когда вы визуализируете страницу по какой-либо причине, запишите эти идентификаторы в блоке скрипта (поместите их в массив или что-то еще)
  • когда вам нужно отправить свои значения, вы можете использовать содержимое массива javascript для ссылки на элементы управления.

вам, возможно, придется немного поработать, чтобы найти свои фактические значения. для необычных элементов управления инграгистики они предоставляют специальный метод для получения информации о «элементе управления» в целом. В элементах управления rad может быть что-то подобное.

person lincolnk    schedule 22.07.2010
comment
Пункты 1 и 2 не будут работать, потому что идентификаторы элементов управления RadComboBox не генерируются во время выполнения - они генерируются из некоторых объектов GridDropDownListColumnEditor, когда моя RadGrid входит в режим редактирования. Bullet 3 может работать, однако даже после использования FireBug я не знаю точно, какой из трех тегов хранит мое необходимое значение (RadComoBox в моем случае, кажется, генерирует три тега HTML, ни один из которых не сохраняет значение, когда я пытаюсь вернуть это с помощью jQuery). - person KSwift87; 22.07.2010
comment
Я ценю ваш ответ, но я думаю, что действительно пришел к ответу после повторного просмотра всего моего JavaScript (не очень красноречиво, но надежно). Выложу после проверки. - person KSwift87; 22.07.2010
comment
Оказывается, мой ответ не работает, как я надеялся ... Поиск ответа продолжается (завтра)! - person KSwift87; 23.07.2010

Итак, ответ, к которому я пришел, не очень красноречив, но он на 100% надежен и все на стороне клиента (что хорошо, потому что у моей компании IE7 в качестве стандартного веб-браузера x_x).

Мне удалось избавиться от кучи команд $ find и операторов if, потому что мне больше не нужно искать определенные идентификаторы HTML.

        function SelectedIndexChanged(sender,eventArgs)
        {
            var rcbID = sender.get_id();
            var LocID = rcbID.substring(0,37) + "Locale";
            pastCombo = currentCombo;
            currentCombo = eventArgs.get_item().get_text();

            if(editedRow != null)
            {
                var Location = $find(LocID);

Поскольку идентификаторы не генерировались на стороне сервера (насколько я мог судить, хотя, по общему признанию, я не пробовал решение Роатина, потому что я думал о своем, прежде чем я увидел его ответ + мой казался проще, так как я уже делаю куча вещей на стороне клиента внутри JavaScript), я огляделся, чтобы увидеть, что я уже получал, и понял, что var rcbID = sender.get_id(); уже дает мне очень похожее значение на то, что я уже искал (только вместо того, чтобы сказать SunLocale, он сказал SunActivity).

Итак, я подумал, что я могу подстроку () выделить все в rcbID, а затем добавить к нему «Locale», а затем запустить для этого команду $ find (), чтобы получить правильный RadComboBox. Оказывается, это работает. В любом случае, я благодарю вас, ребята, за то, что вы изучили мою проблему, хотя в итоге я нашел свое собственное решение. :-)

person KSwift87    schedule 23.07.2010