You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GopherJS中如何正确替代JavaScript的$(this)获取绑定元素?

如何在GopherJS中模拟JavaScript里的$(this)?

最近我在把一个单页应用从JavaScript转成GopherJS,碰到了个小坑:在处理列表项的点击事件时,没法像JS里那样用$(this)拿到绑定事件的<li>元素。

先给大家看看原JavaScript代码:

var list = $('.all-products .products-list'); 
list.find('li').on('click', function (e) { 
    e.preventDefault(); 
    var productIndex = $(this).data('index'); 
    window.location.hash = 'product/' + productIndex; 
})

我自己写的GopherJS代码是这样的:

list := jquery.NewJQuery(".all-products .products-list") 
list.Find("li").On("click", func(e jquery.Event) { 
    e.PreventDefault() 
    // productIndex := jquery.NewJQuery(e.Target).Data("index").(float64) 
    // dom.GetWindow().Location().Hash = "product/" + productIndex 
})

问题出在注释掉的那一行:用jquery.NewJQuery(e.Target)拿到的不是绑定事件的<li>,而是<li>内部的<div>元素。后来我想明白了,JS里事件回调的this其实对应的是事件绑定的元素,也就是event.currentTarget,而event.target只是实际触发事件的子元素(这里就是内部的div)。

那在GopherJS里怎么解决呢?很简单,把e.Target换成e.CurrentTarget就可以了!因为CurrentTarget始终指向绑定了事件处理函数的那个DOM元素,和JS里的this行为完全一致。

修改后的完整代码如下(记得导入strconv包来把float64转成字符串):

import (
    "github.com/gopherjs/gopherjs/js"
    "github.com/gopherjs/jquery"
    "strconv"
)

// ...

list := jquery.NewJQuery(".all-products .products-list")
list.Find("li").On("click", func(e jquery.Event) {
    e.PreventDefault()
    // 用CurrentTarget拿到绑定事件的li元素
    productIndex := jquery.NewJQuery(e.CurrentTarget).Data("index").(float64)
    // 把float64转成字符串再拼接
    js.Global.Get("window").Get("location").Set("hash", "product/" + strconv.FormatFloat(productIndex, 'f', 0, 64))
})

这样就能完美模拟JS里$(this)的效果啦,不管点击的是<li>内部的哪个子元素,都能正确获取到对应的index值。

内容的提问来源于stack exchange,提问作者Ralph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:22:54