王一之 发表于 2022-8-16 18:21:34

steven026 发表于 2022-8-16 17:31
!(data/attachment/forum/202208/16/173139omdddh8ztlj4u1mz.png)

哥哥这么猛么

steven026 发表于 2022-8-16 18:30:55

Aileyu 发表于 2022-8-16 18:11
确实有用,辛苦大佬了,但是我在另一个链接里还是没用
https://jingyan.baidu.com/edit/content
这个链接 ...

我看了下源码里面用的是jQuery().val()
比如第一个请选择分类要选游戏/数码,游戏/数码的value="10"
然后可以试试
$("#category > select.category-select.category-level-1").val("10")
或者
document.querySelector("#category > select.category-select.category-level-1").value="10"

Aileyu 发表于 2022-8-16 18:38:24

steven026 发表于 2022-8-16 18:30
我看了下源码里面用的是jQuery().val()
比如第一个请选择分类要选游戏/数码,游戏/数码的value="10"
然后 ...

还是不行

Aileyu 发表于 2022-8-16 22:08:02

steven026 发表于 2022-8-16 16:25
$("#category > select.category-select.category-level-1").val("10")
$("#category > select.category- ...

第二句如果用原生js该怎么写呢

steven026 发表于 2022-8-16 22:27:09

本帖最后由 steven026 于 2022-8-16 22:45 编辑

Aileyu 发表于 2022-8-16 22:08
第二句如果用原生js该怎么写呢
document.querySelector("#category > select.category-select.category-level-1").value="10"

document.querySelector("#category > select.category-select.category-level-1").selectedIndex=2


document.querySelector("#category > select.category-select.category-level-1 > option:nth-child(3)").selected=true

然后
document.querySelector("#category > select.category-select.category-level-1").dispatchEvent(new Event("change",{bubbles:true}))
至于{bubbles:true},我猜这个事件是通过委托绑的不是直接绑在select上的,所以要冒泡才能触发
反正能触发就对了,具体原理问问大佬 @李恒道   吧,这个通过jQuery绑的事件我也一知半解

Aileyu 发表于 2022-8-16 22:50:42

steven026 发表于 2022-8-16 22:27
document.querySelector("#category > select.category-select.category-level-1").value="10"

documen ...

太感谢了,问题终于解决了,第一次来这个论坛就这么多人热情回复

李恒道 发表于 2022-8-16 23:51:19

steven026 发表于 2022-8-16 22:27
document.querySelector("#category > select.category-select.category-level-1").value="10"

documen ...
jquery的那个事件委托确实没有绑定在select
关于怎么调试可以在设置一个dom插入断点然后回溯
可以看到dispatch函数
```
         dispatch: function(e) {
            e = ct.event.fix(e);
            var n, r, i, o, a, s = [], u = ot.call(arguments), l = (ct._data(this, "events") || {}) || [], c = ct.event.special || {};
            if (u = e,
            e.delegateTarget = this,
            !c.preDispatch || c.preDispatch.call(this, e) !== !1) {
                for (s = ct.event.handlers.call(this, e, l),
                n = 0; (o = s) && !e.isPropagationStopped(); )
                  for (e.currentTarget = o.elem,
                  a = 0; (i = o.handlers) && !e.isImmediatePropagationStopped(); )
                        (!e.namespace_re || e.namespace_re.test(i.namespace)) && (e.handleObj = i,
                        e.data = i.data,
                        r = ((ct.event.special || {}).handle || i.handler).apply(o.elem, u),
                        r !== t && (e.result = r) === !1 && (e.preventDefault(),
                        e.stopPropagation()));
                return c.postDispatch && c.postDispatch.call(this, e),
                e.result
            }
      },
```
因为混淆过
我们看个大概就好了
i = o.handlers
从o拿handlers
而o来自于
o = s
s则来自于s = ct.event.handlers.call(this, e, l)
调试handlers可以知道
for (o = [],
                        a = 0; u > a; a++)
                            i = n,
循环来自u变量
u来自于
u = n.delegateCount
n来自于传入的函数
那么我们继续看传入的l
l = (ct._data(this, "events")
还是换汤不换药
根据https://bbs.tampermonkey.net.cn/thread-1250-1-1.html
确定一下this是哪个dom元素

document.querySelector("#category > select.category-select.category-level-1").selectedIndex=2
ddd=document.querySelector('.wgt-category')
$._data(ddd,'events').change.handler()
直接干爆
相当于基于jq做了一层简易的过滤封装
页: 1 [2]
查看完整版本: 求助大佬,怎么用js点击表单option