visualforce selectRadio — как получить ссылку через Javascript?

#javascript #salesforce #visualforce #apex-code

#javascript #salesforce #visualforce #apex-code

Вопрос:

У меня есть переключатель для управления, и из моего Javascript я пытаюсь получить массив радиовхода через javascript getElementsByName()

Первое предупреждение: alert(radioTitleDisplay);

ВОЗВРАТ [object HTMLCollection]

Однако второе предупреждение не срабатывает. И отчеты Firebug

 radioTitleDisplay.options is null.
  

Как я могу получить доступ к переключателю. Я что-то упускаю? (Я мог бы присвоить id каждому тегу от root до дочерних элементов, но я не хочу этого делать, поскольку, если я изменю структуру, мне также придется изменить идентификатор, который не является обычным.)

 <apex:form >
   <apex:selectRadio value="{!titleDisplay}" id="titleDisplayRadio">
       <apex:selectOption itemValue="0" itemLabel="one"  />
       <apex:selectOption itemValue="1" itemLabel="two"  />
       <apex:selectOption itemValue="2" itemLabel="three"  />

       <script type="text/javascript">

          var radioTitleDisplay = document.getElementsByName('{!$Component.titleDisplayRadio}');

          alert(radioTitleDisplay);
          alert(radioTitleDisplay.options);                                     
       </script>
    </apex:selectRadio>
</apex:form>
  

Отображаемая страница visualforce, один из входных тегов:

 <input type="radio" value="2" id="thePage:j_id27:titleDisplayRadio:2" 
name="thePage:j_id27:titleDisplayRadio">
  

Ответ №1:

Мое предложение, использовать jQuery. Очень помогает, особенно при копании в итеративных и других списках.

То, что вы сделали здесь, это получили список входных HTML-объектов, у этого списка нет свойства options. Переключатели HTML DOM отключены, нет центрального объекта, который содержит их все.

РЕДАКТИРОВАТЬ: Этот код, например, предупредит вас о выбранном переключателе:

 var myradios = document.getElementsByName('{!$Component.myRadio}');
for(i = 0; i < myradios.length; i  ) 
    if(myradios[i].checked) {
        // now we now the selected index
        alert('Selected value is: '   myradios[i].value);
    }
  

Комментарии:

1. Я согласен, но проблема в том, что SF изменяет идентификатор элемента, поэтому он создается динамически, и использование подхода $ Component, похоже, не работает для меня, как описано выше. Я могу получить ссылку на элемент, если это просто переменная. В случае массива, подобного приведенному выше, я не могу понять, как получить ссылку.

2. Да, это так, но отражено в выводе $Component. С вашим кодом все в порядке, вам просто нужно понимать, что набор элементов <input type =radio> не является единым объектом DOM, вы всегда получите коллекцию. Любая операция, которую вы хотите выполнить в JS, должна выполняться над элементами коллекции, так работает html dom, ничего общего с salesforce.

3. Спасибо за понимание. Не могли бы вы предоставить пример кода? Я все еще не понимаю, почему мой подход не работает.

4. Я обновил сообщение примером кода, чтобы определить выбранный переключатель.