Запустить событие вручную

Существует веб-сайт, который создает элементы, подобные приведенным ниже, и присоединяет к ним функцию onChange:

o.createElement(k.InputField, {
                label: "Enter mobile number",
                variant: "secondary",
                value: i.trim(),
                disabled: v,
                InputProps: {
                  onChange: ({ target: { value: e } }) => {
alert("testing");
                  },
                  maxLength: 10,
                  autoFocus: !0,
                  id: "mobileNum",
                },
                error: Ve.mobileNumberValidationMessage(f, String(i)),
                before: o.createElement(k.Text, { variant: "body", color: "text.2" }, "+", 91),
                css: Ct,
              })

Я пробовал все, чтобы вызвать его, только когда я печатаю на клавиатуре, это вызывает предупреждение. Я даже зациклил все события, как показано ниже, но ничего не вызывает:

 const inputElement = document.getElementById("mobileNum");

                  // Step 2: Set its value programmatically
                  const newValue = "9"; // Example new value
                  inputElement.value = newValue;
const eventTypes = [
    "input",        // Input event when the value of an input element changes
    "change",       // Change event when the value of an input element changes and loses focus
    "keydown",      // Keydown event when a key is pressed down
    "keyup",        // Keyup event when a key is released
    "keypress",     // Keypress event when a key is pressed
    "click",        // Click event when a mouse click occurs
    "dblclick",     // Double click event when a mouse double click occurs
    "mousedown",    // Mousedown event when a mouse button is pressed down
    "mouseup",      // Mouseup event when a mouse button is released
    "mousemove",    // Mousemove event when the mouse pointer is moved
    "mouseover",    // Mouseover event when the mouse pointer enters an element
    "mouseout",     // Mouseout event when the mouse pointer leaves an element
    "wheel",        // Wheel event when the mouse wheel is scrolled
    "contextmenu",  // Contextmenu event when the right mouse button is clicked
    "touchstart",   // Touchstart event when a finger touches the screen
    "touchend",     // Touchend event when a finger is removed from the screen
    "touchmove",    // Touchmove event when a finger is dragged across the screen
    "touchcancel",  // Touchcancel event when a touch event is interrupted
    "focus",        // Focus event when an element gains focus
    "blur",         // Blur event when an element loses focus
    "submit",       // Submit event when a form is submitted
    "reset",        // Reset event when a form is reset
    "resize",       // Resize event when the window or element is resized
    "scroll"        // Scroll event when the window or element is scrolled
];

eventTypes.forEach(eventType => {
    const event = new InputEvent(eventType, {
        inputType: "insertText",
        data: newValue,
        bubbles: true,
        composed: true
    });
    inputElement.dispatchEvent(event);
});

Все, что он делает, это вводит ввод, но он не предупреждает об изменении, но если я нажимаю клавишу Backspace или печатаю что-то вручную, он предупреждает.

Как мне продемонстрировать реальное поведение при наборе текста на этом входе?

«Есть сайт»? Это ваш сайт? Можете ли вы изменить его? Кроме того, похоже, что вы хотите запускать программно, а не вручную. Возврат осуществляется вручную.

isherwood 19.04.2024 22:56

Это не мой веб-сайт, я пытаюсь провести тестирование на внешнем веб-сайте, я пытаюсь сделать это программно через консоль разработчика.

Gracie williams 20.04.2024 06:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
401
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это может быть случай, когда DOM еще не полностью загружен в момент, когда вы пытаетесь вызвать событие. Это работает, когда вы меняете поле вручную, потому что DOM в это время наверняка загружен. Но в противном случае вы можете программно попытаться вызвать событие до того, как оно будет фактически привязано.

Например, в jQuery есть функция $(document).ready(), которая выполняется после загрузки DOM. Если вы не используете jQuery, одним из вариантов может быть использование тега body для ссылки на функцию загрузки:

<body onload = "javascript:triggerChange()">

Функция триггерChange будет содержать ваш код для запуска события.

Нет, я тестирую его через консоль разработчика после полной загрузки страницы.

Gracie williams 20.04.2024 06:58
Ответ принят как подходящий

Вероятно, вам нужно «как активировать доверенный ввод», и это просто, для этого вы можете использовать document.execCommand(). Например.

document.getElementById('mobileNum').focus();
document.execCommand('insertText', false, "9837585855");
document.getElementById('getOtp').click();

РЕДАКТИРОВАТЬ

По моему мнению, несмотря на то, что описанный выше метод устарел, он все еще работает и в настоящее время не должен быть проблемой, но я не уверен, какой вариант использования вам нужен. Итак, я предлагаю другой способ:

const input = document.getElementById('mobileNum');
Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set.call(input, "9837585855");
const event = new Event('input', { bubbles: true });
input.dispatchEvent(event);
document.getElementById('getOtp').click();

К вашему сведению, document.execCommand устарел: Developer.mozilla.org/en-US/docs/Web/API/document/execComman‌​d

D M 22.04.2024 16:04

Привет, это работает, можете ли вы предложить какие-нибудь альтернативы, поскольку они устарели?

Gracie williams 22.04.2024 16:51

@Graciewilliams, пожалуйста, проверьте мое редактирование выше

Damzaky 23.04.2024 00:29

@Damzaky, редактирование работает так, как ожидалось, можете ли вы рассказать, что вы сделали во второй строке.

masteronin99 28.04.2024 18:14

Очень просто-> Нет необходимости использовать какие-либо специальные функции. Все, что вам нужно сделать, это просто установить value из input на номер вашего мобильного телефона с помощью setAttribute и отправить событие input. (Удалите последнюю строку (.click), если вы не хотите автоматически нажимать кнопку отправки OTP)

const input= document.getElementById("mobileNum");
input.setAttribute("value", '9192939495');
const event = new Event('input', { bubbles: true });
input.dispatchEvent(event);
document.getElementById('getOtp').click();

ах да, это работает ~~игнорируйте ответное сообщение, отправленное на ваш телефон, потому что я его проверял~~

The Bomb Squad 29.04.2024 14:35

Вы можете вручную вызвать метод:

inputElement.onchange()

если это не сработает, попробуйте вместо этого .onChange().

Пример:

let input = document.getElementById('input')
input.onchange = () => alert('test')
function triggerChange(){
    input.onchange()
}
<p>Type or click the button to trigger change: </p>
<input id = "input">
<button onclick = "triggerChange()">Trigger change</button>

Как мне получить репутацию 300?

Mulham Alamry 26.04.2024 09:28

У вас очень конкретная цель, поэтому ответ может быть очень прямым.

Этот сайт использует ReactJS, который на серверной части может выглядеть как нечто одно, но на стороне браузера всегда интерпретируется как обычный JavaScript. Я проверил элемент input, сослался на него в консоли, он содержит атрибут __reactEventHandlers$probablyrandomtext, который сам по себе является объектом, включающим функцию onChange, отвечающую за управление оповещениями, которые вы видите только при вводе текста.

const mobileNum=document.getElementById('mobileNum')

const reactEventHandler=Object.keys(mobileNum)
  .filter(u=>u.includes('reactEventHandler'))[0]

const orig=mobileNum[reactEventHandler].onChange


//USAGE
orig({target:{value:""}}) //blank example
orig({target:{value:"1234"}}) //not enough digits example
orig({target:{value:"1231231234"}}) //incorrect number example

Хорошего дня :D

Другие вопросы по теме