Я пробую Javascript на платформе Microsoft с консоли. Что я сделал, так это ввел значение такой формы
document.forms[0][0].value = "[email protected]";
Когда я ищу следующую кнопку, я могу сделать и этот файл.
document.forms[0][3]
Моя проблема возникает, когда я пытаюсь нажать кнопку с помощью JavaScript, используя
document.forms[0][3].click()
Что странно, так это то, что когда я ВРУЧНУЮ нажимаю кнопку «Далее», это работает, но, похоже, не работает с JavaScript. Что я делаю не так?
Пожалуйста, опубликуйте минимально воспроизводимый пример . Вы можете использовать Фрагмент стека, чтобы сделать его исполняемым.
Ссылки в ОП выглядят подозрительно.
Я использовал document.getElementById("i0116").value = "[email protected]"; и document.getElementById("idSIButton9").click(). Это все равно дает ту же проблему.
Комментарий, состоящий всего из двух операторов и без HTML, не является минимально воспроизводимым примером .
Вам нужно опубликовать достаточно кода, чтобы мы могли увидеть, что должно делать нажатие кнопки, и выяснить, почему она этого не делает.
И опубликуйте его в виде текста (желательно фрагмента стека), а не скриншота.
@Barmar Весь код, необходимый для воспроизведения проблемы, указан в вопросе. Попробуйте посетить login.microsoftonline.com и ввести команды document.forms[0][0].value = "[email protected]"; и document.forms[0][3].click(). Вы увидите именно то, что показано на обоих скриншотах. Не вижу проблемы в вопросе. Проблема описана очень коротко и ясно.
@Foxyz Эта информация должна быть в самом вопросе. Комментарии всегда подлежат удалению. И вряд ли было очевидно, что вы говорите о стороннем сайте, а не о написанном вами коде.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я попробовал и заметил, при каких условиях это происходит. Ошибка выдается только в том случае, если вы вводите значение программно и затем нажимаете «Отправить».
Проблема не в том, что кнопка «Отправить» не работает, проблема в том, что вы вводите адрес электронной почты в поле ввода. Электронная почта вводится в поле, но базовый JavaScript, вероятно, не запускается из-за установки значения через скрипт. Щелчок по текстовому полю вручную, а затем запуск функции щелчка работает.
Я заметил, что JavaScript, который устанавливает адрес электронной почты, введенный в поле ввода, запускается, когда вы щелкаете за пределами поля ввода. Это наводит меня на мысль, что это прослушиватель событий, который устанавливает переменную в JavaScript, и эта переменная — это то, что отправляется на сервер, а не входные данные напрямую из поля.
Чтобы обойти эту проблему, мы сначала проведем небольшой обратный инжиниринг и посмотрим, как это работает. К счастью, JavaScript очень прост, и мы можем легко увидеть все прослушиватели событий, используя удобные инструменты разработчика в нашем браузере, такие как Firefox:
и Хром:
Все, что нам нужно сделать, это попытаться отправить некоторые из этих событий и посмотреть, какие из них эффективны.
Чтобы определить, сработало ли событие, которое я отправлял, я сначала отправил событие щелчка на следующую кнопку, чтобы она показывала ошибку, по сути делая именно то, что вы сделали, чтобы намеренно добиться сбоя, и пытался отправлять события в поле ввода, пока ошибка не исчезла. поскольку нажатие вручную рядом с полем ввода также привело к исчезновению ошибки, что указывает на то, что значение JavaScript для поля ввода было обновлено через прослушиватель событий.
Поскольку мы знаем, что JavaScript запускается, когда что-то происходит с полем ввода, мы можем начать с предположения, что поле ввода имеет прослушиватель событий, который Сначала я попробовал отправить события фокусировки и размытия. Это не сработало, поэтому я попробовал выбрать, что тоже не сработало. Затем я попробовал событие изменения и успех!
Вот код JavaScript, который я написал для этого:
{
const event = new Event("change");
document.forms[0][0].value = "[email protected]";
document.forms[0][0].dispatchEvent(event);
document.forms[0][3].click();
}
Обратите внимание, что я поместил его в блок, просто чтобы настроить область действия, чтобы избежать повторного объявления этой переменной события, поскольку потенциально может потребоваться вставить этот сценарий в консоль несколько раз.
Простыми словами, вот что мы делаем:
Еще одно улучшение, которое следует сделать, — это избегать повторения подобных слов:
{
const email = "[email protected]"; // We separate this to make modifying easier.
const form = document.forms[0];
form[0].value = email;
form[0].dispatchEvent(new Event("change"));
form[3].click();
}
Если у вас есть какие-либо другие проблемы или вопросы, связанные с изучением JavaScript, вы всегда можете обратиться за помощью! Если какой-либо из моих шагов неясен, вы можете сообщить мне, я пытаюсь немного объяснить мыслительный процесс, чтобы вы могли научиться использовать доступные инструменты для устранения проблем, с которыми вы сталкиваетесь, чтобы вы не только получили решение, но и поняли откуда пришло это решение.
Event.initEvent() устарел. Вместо этого вы можете использовать const event = new Event("change").
Привет @Foxyz, не мог бы ты отредактировать свою фотографию, потому что я не вижу ее в твоем ответе?
Foxyz, не могли бы вы также сказать мне, почему я не могу использовать, например, случайный щелчок document.getElementById("i0281").click(); (Нажмите за пределами поля), это не работает? Мне очень любопытно, как вы нашли решение, требующее события, но я не вижу этого на картинке.
@PRO Спасибо, что сообщили мне! Я какое-то время не использовал обработчики событий, поэтому нужно немного узнать, какие их части устарели. Делать это так, как вы объясняете, имеет больше смысла, мне было интересно, для чего нужен этот параметр. Я обновлю код.
@phil_sw Я попробовал вручную щелкнуть рядом с полем, но это тоже не сработало. Это позволило мне нажать кнопку «Далее» только после того, как я сначала щелкнул поле ввода, а затем щелкнул где-то еще. На самом деле я сначала подумал о моделировании событий щелчка с использованием событий вместо функции click(). Я не был уверен, читает ли он поле ввода только после того, как событие щелчка было выполнено внутри определенной области экрана, или он может прослушивать события щелчка в родительских элементах поля ввода. Способ запуска JavaScript — это прослушиватели событий, поэтому я попытался имитировать события в поле ввода.
Эти индексные числа ничего не значат без HTML. Сделайте себе одолжение: вызовите такие функции, как
document.getElementById()илиdocument.querySelector(), для доступа к элементам DOM.