Ваш конкретный пример работает для меня, но если я добавлю еще одно поле с тем же именем:
<input type="text" name="keyword1" />
<input type="text" name="keyword1" />
Тогда document.adv_search.keyword1.focus()
завершится с ошибкой, которую вы указали.
Причина в том, что:
document.adv_search.keyword1
является сокращением для этого синтаксиса (который восходит к DOM Level 0 и Netscape 2 дня!):
document.forms.adv_search.elements.keyword1
(Между прочим, лучше использовать этот полный синтаксис, а не полагаться на поведение объектов «документ» и «форма», индексируемых по именам: если новый метод добавляется в HTMLDocument или HTMLFormElement, это может привести к конфликту с именем элемента управления, который вы используете. Это не проблема, когда вы используете коллекции document.forms или form.elements. Кроме того, IE по ошибке выгружает все имена и идентификаторы в «документ», так что если у вас есть элемент с id="adv_search"
в дополнение к форме с таким именем, document.adv_search
вернет неправильную.)
В любом случае, методы сценариев DOM Level 0 ведут себя немного странно, когда вы обращаетесь к элементу по имени, как это. Если есть один соответствующий элемент, вы получите его как отдельный объект. Если, с другой стороны, их несколько, вы получите список объектов. Вы не можете вызвать focus()
или select()
в массивоподобном списке, поэтому появляется ошибка; вам нужно будет сделать что-то вроде ключевого слова1 [0] .focus (), когда список будет возвращен.
Таким образом, вы должны решить, будете ли вы использовать старые методы DOM Level 0 для доступа к элементам управления формой - в этом случае вам придется справляться с анализом для одного или нескольких элементов управления. - или перейдите к методам на основе идентификаторов, введенным в DOM Level 1:
document.getElementById('keyword1').focus();
Методы на основе идентификаторов, как правило, немного более типизированы (в скрипте и для добавления идентификаторов ко всем элементам, к которым вы хотите получить доступ таким образом, если они еще не имеют их), но они просты и однозначны. (Также вы можете сбросить name
на .)