#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. Я обновил сообщение примером кода, чтобы определить выбранный переключатель.