Фокус JavaScript () и выбор () причуда

У меня была похожая ситуация при тестировании apis. В итоге я связал экземпляр GuzzleClient с сервисным контейнером (см. Документацию ). Что-то вроде:

$this->app->instance('GuzzleHttp\Client', new MockClient);

Чтобы успешно смоделировать экземпляр, я затем проверил, имеет ли он определенное значение свойства (в моем случае base_url устанавливается). Это определило, был ли экземпляр тестом, поскольку base_url будет установлен.

Помимо этого метода, GuzzleHttp\Client имеет MockHandler , который вы можете захотеть исследовать. Это может быть использовано для фальсификации тел ответа, заголовков и кодов состояния.

5
задан casperOne 26 June 2012 в 18:51
поделиться

2 ответа

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

<input type="text" name="keyword1" />
<input type="text" name="keyword1" />

Затем document.adv_search.keyword1.focus() перестанет работать с ошибкой, которую Вы указываете.

Причина состоит в том что:

document.adv_search.keyword1

ярлык для этого синтаксиса (который возвращается к Уровню 0 DOM и Netscape 2 дня!):

document.forms.adv_search.elements.keyword1

(Кстати, лучше использовать этот полный синтаксис, вместо того, чтобы полагаться на поведение 'документа' и объектов 'формы', индексируемых на именах: если новый метод добавляется к HTMLDocument или HTMLFormElement, который мог бы столкнуться с именем элемента управления, Вы используете. Это - меньше проблемы при использовании document.forms или form.elements наборов. Кроме того, IE по ошибке выводит все имена и идентификаторы в 'документ', поэтому если у Вас есть элемент с id="adv_search" в дополнение к форме с этим как имя, document.adv_search возвратит неправильный.)

Так или иначе методы сценариев Уровня 0 DOM ведут себя немного любопытно при доступе к элементу по имени как это. Если будет единственный элемент соответствия, то Вы получите тот как автономный объект. Если с другой стороны, будет больше чем один, то Вы получите список объектов. Вы не можете звонить focus() или select() в подобном массиву списке, который является, почему ошибка появляется; необходимо было бы сделать что-то как keyword1[0].focus (), когда список был возвращен.

Таким образом, необходимо решить, собираетесь ли Вы быть использующими олдскульными методами Уровня 0 DOM для доступа к средствам управления формой   —  in, какой случай Вы оказываетесь перед необходимостью справляться со сниффингом для single-or-multiple-controls   —  or, перемещаются в основанные на идентификаторе методы, представленные ‘Уровнем 1 DOM’:

document.getElementById('keyword1').focus();

Основанные на идентификаторе методы обычно немного больше вводят (в сценарии и добавить ‘идентификатор ко всем элементам, Вы хотите получить доступ к этому пути, если у них уже нет их), но они просты и однозначны. (Также можно затем отбросить name на сама <форма>.)

9
ответ дан 13 December 2019 в 05:42
поделиться

Идентификационный подход действительно является лучшим, но если Вы хотите пойти по имени, используйте 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>
3
ответ дан 13 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: