2015-01-10 1 views
1

У меня есть сценарий Greasemonkey, который автоматизирует ввод информации о пользователе. Но перед тем, как форма может быть отправлена, поля должны быть в фокусе (я думаю, что они используют AngularJS для проверки того, что введено действительное имя/адрес электронной почты). Поэтому в моем коде я делаю:Текстовое поле не будет фокусироваться, если окно не находится в фокусе

document.getElementById('name').value = "Name here"; //Enter name in field 
document.getElementById('name').focus(); //Focus on the field 

Это работает нормально, но только при активном окне. Если окно не активно, оно будет вводить имя, но поле не будет фокусироваться (поэтому оно не может быть отправлено). Есть ли какие-либо изменения, которые можно сделать, чтобы исправить это?

Редактировать: Мне трудно представить пример, потому что код должен быть запущен из окна, которое не является активным, но вот код для поля ввода.

<input id="namefield[name]" name="name" ng-model="nameField.form.name" ng-pattern="nameRegex()" placeholder="John Doe" required="" style="width: 246px" type="text" class="ng-valid-pattern ng-dirty ng-valid ng-valid-required"> 
+0

Этот вопрос еще не завершен; у нас недостаточно информации для репликации проблемы. Если нижеприведенный ответ не работает, страница динамически изменяет фокус (или целевой узел (узлы)), и вы действительно должны либо предоставить доступ к странице оскорбительных, либо отбросить ее до краткого, публично опубликованного примера, который показывает такое же поведение. –

ответ

1

Угловой JS сильно управляется AJAX, поэтому это, вероятно, вещь времени. JS, особенно таймеры, is slowed down on pages that don't have focus.

Возможно, что достаточно использовать технику, поддерживающую AJAX, будет достаточно. EG:

// ==UserScript== 
// @name  _Focus the name input 
// @include http://YOUR_SERVER.COM/YOUR_PATH/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js 
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js 
// @grant GM_addStyle 
// ==/UserScript== 
/*- The @grant directive is needed to work around a design change 
    introduced in GM 1.0. It restores the sandbox. 
*/ 
waitForKeyElements ("#name", focusInput, true); 

function focusInput (jNode) { 
    jNode[0].focus(); 
} 

Обратите внимание, что вопрос код списка: <input id="namefield[name]"... но поиск по идентификатору name.
Если это не ошибка, это знак того, что AngularJS переписывает HTML (я еще не многому научился AngularJS), что станет еще одним доказательством того, что оригинальный скрипт работал вообще, из-за победы гонки состояние. То есть, не является надежным вообще.

Смежные вопросы