Объясните javascript - PullRequest
       3

Объясните javascript

0 голосов
/ 04 августа 2020

Я работаю над автоматизацией сайта, и есть форма с полем ввода. Я устанавливаю его значение, как показано ниже

var elem = document.getElementById('mobile');
elem.value = '1234567890';
elem.dispatchEvent(new Event('input', { bubbles: true }));
elem.dispatchEvent(new Event('blur', { bubbles: true }));

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

Но я наткнулся на расширение, которое выполняет ту же работу и без каких-либо ошибок, когда я декомпилировал код, я обнаружил эту строку, которая правильно устанавливает значение ввода

_0x76ed32['dispatchEvent'](new Event('blur')), $(_0x76ed32)[a0_0x3fed('0x9f')](a0_0x3fed('0x3b'), _0x5bf4db), _0x76ed32[a0_0x3fed('0xb3')](new Event('input'));

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

1 Ответ

2 голосов
/ 04 августа 2020

Это немного похоже на минимизированный код, где вызов функции часто сокращается путем создания таблиц поиска, поэтому вы можете сэкономить некоторые биты при длинных вызовах функций, таких как Element.dispatchEvent, и вместо этого минимизировать его до e[l(p)].

Переменная _0x76ed32 содержит ссылку на ваш элемент ввода.

_0x76ed32['dispatchEvent'](new Event('blur'))

Это вызов функции вашего элемента. Это эквивалентно обычному обозначению, которое вы видите:

_0x76ed32.dispatchEvent(new Event('blur'))

, что означает, что он просто отправляет событие размытия. Этот метод написания вызова функции типичен, если вы не знаете имя функции, и решение о нем принимается во время выполнения, например,

let func = 'dispatchEvent';
_0x76ed32[func](new Event('blur'))

Найдите «отражение», чтобы узнать больше об этом.

Следующий фрагмент кода является хорошим примером для этого:

a0_0x3fed('0x9f')

возвращает имя функции, которое затем вставляется в следующий вызов функции

$(_0x76ed32)[a0_0x3fed('0x9f')](a0_0x3fed('0x3b'), _0x5bf4db)

Я предполагаю, что это настройка значение входного элемента _0x76ed32, но почему элемент оборачивается $(_0x76ed32) и каковы два параметра функции, нельзя сказать только из этой строки кода. Я предполагаю, что это похоже на собственный вызов setAttribute(name,value).

и, наконец, у вас есть следующий фрагмент кода:

_0x76ed32[a0_0x3fed('0xb3')](new Event('input'))

Здесь a0_0x3fed('0xb3') снова возвращает имя функции. Из проверки вызова, скорее всего, это dispatchEvent, который затем отправляет событие input в элемент _0x76ed32.

Это может работать примерно так:

let _0x76ed32 = document.querySelector("input"),
  fields = {
    '0xb3': "dispatchEvent",
    '0x3b': "value",
    '0x9f': "setAttribute"
  },
  a0_0x3fed = par => fields[par],
  _0x5bf4db = "new value :)";
  
// slightly changed the code
_0x76ed32[a0_0x3fed('0xb3')](new Event('input'));
_0x76ed32[a0_0x3fed('0x9f')](a0_0x3fed('0x3b'), _0x5bf4db);
_0x76ed32[a0_0x3fed('0xb3')](new Event('blur'));
<input type="text" value="old value!" />

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

var elem = document.getElementById('mobile');
elem.value = '1234567890';
elem.dispatchEvent(new Event('blur', { bubbles: true }));
elem.dispatchEvent(new Event('input', { bubbles: true }));
<input id="mobile" type="text" value="123" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...