【问题标题】:Explain the javascript解释一下javascript
【发布时间】:2020-08-04 06:43:39
【问题描述】:

我正在开发网站自动化,并且有一个带有输入字段的表单。我将其值设置如下

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 专家都可以为此提供有意义的代码

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这看起来有点像最小化代码,其中函数调用通常通过创建查找表来缩短,因此您可以在像 Element.dispatchEvent 这样的长函数调用上节省一些位,而是将其最小化为 e[l(p)]

    变量_0x76ed32 保存对输入元素的引用。

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

    这是对元素的函数调用。它相当于你看到的通常的符号:

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

    意味着它只是调度 blur 事件。如果您不知道函数的名称并且它是在运行时决定的,那么这种编写函数调用的方法是典型的,例如

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

    查找“反射”以了解更多信息。

    下面的代码 sn-p 就是一个很好的例子:

    a0_0x3fed('0x9f')
    

    返回一个函数名,然后插入到下面的函数调用中

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

    我假设它正在设置输入元素 _0x76ed32 的值,但是为什么要包装元素 $(_0x76ed32) 以及两个函数参数是什么,仅从这行代码中无法得知。
    我认为它类似于原生的setAttribute(name,value) 调用。

    最后你有以下代码sn-p:

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

    这里,a0_0x3fed('0xb3') 再次返回一个函数名。通过检查调用,很可能是dispatchEvent,然后在元素_0x76ed32 上调度input 事件。

    它可能会像这样工作:

    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" />

    【讨论】:

    • 非常感谢。调度模糊事件,然后设置值,然后调度输入事件工作得很好。一个查询,在某些元素上keydownkeyup 事件也被触发。能否请您提及触发这些事件的正确方法,尤其是它们的顺序
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2016-11-21
    • 1970-01-01
    • 2012-04-07
    • 2020-06-08
    相关资源
    最近更新 更多