Фокус Javascript () и select () - PullRequest
       15

Фокус Javascript () и select ()

4 голосов
/ 06 апреля 2009

Я работаю над формой и получаю нулевой или нет объект ошибок в т. Е.

<form action="#" method="post" name="adv_search">

<input class="inputbox" type="text" name="keyword1" value="none" id="keyword1"/>
</form>

<script>
document.adv_search.keyword1.focus();
document.adv_search.keyword1.select();
</script>

// тогда как если я использую

<script>
var key1 = document.getElementById('keyword1');
   key1.focus();
   key1.select();
</script>

// все хорошо

Я хотел бы понять, почему. я хотел бы, чтобы это работало без наличия тега id для поля ввода

заранее спасибо


не должен указывать document.formname.fieldname.focus (); и document.formname.fieldname.select (); работа

Ответы [ 2 ]

9 голосов
/ 06 апреля 2009

Ваш конкретный пример работает для меня, но если я добавлю еще одно поле с тем же именем:

<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 на .)

2 голосов
/ 06 апреля 2009

Идентификационный подход действительно лучше, но если вы хотите использовать имя, используйте getElementsByName .

В этом случае это может выглядеть так:

<script>
   // retrieves array of objects with the name 'keyword1' 
   // and takes the first one
   var key1 = document.getElementsByName('keyword1')[0]; 
   key1.focus();
   key1.select();
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...