一般来说,在纯js或jquery中,或者在rails上下文中,如何获得单击的DOM元素?
通常您会这样做,允许您使用$(this).whatever_method
$(#something).on('click', function()
{
$(this).do_something;
}_;但在我的例子中,我的html中有一个远程链接: true,在我的控制器中,我呈现了一个js.erb文件。在这种情况下,将执行js.erb文件中的所有javascript代码。没有一个点击监听器的位置,因为这个js.erb文件执行的唯一原因是已经单击了一些东西。但我确实希望选择单击的DOM元素。我该怎么做?
我不想简单地手动选择它,因为这不是非常动态或可重用的(另外,我必须注入逻辑来选择正确的逻辑)。
html
<%= link_to "text", send(some_path, @votable, vote_type: "#{s.name}"), remote: true, class: "option" %>
<%= link_to "text", send(some_path, @votable, vote_type: "#{s.name}"), remote: true, class: "option" %>控制器
def action
render 'shared/vote'
end/views/shared/vote.js.erb
// how to obtain the link that i clicked in the html file (i.e. the first `".option"` link rather than the second.
// would using `$(this)` here, work? it seems wrong.发布于 2014-07-20 09:53:49
Ajax
即使您使用的是remote: true,仍然有一个click侦听器的空间。最好将ajax钩与发起远程ajax调用的元素一起使用:
$(document").on("ajax:beforeSend", "#your_element", function(){
$(this).hide(); -> hides element
});我认为您将能够在示例中的.click事件绑定器上使用此方法。原因是,虽然您可以调用click,但它基本上不会对ajax调用产生任何影响;而使用ajax hooks之一将对其产生一定影响。
--
Rails
关于您的Rails后端(您的.js.erb文件),您将无法将$(this)引用到应用程序的该部分。JS使用DOM的原因--这意味着它只能观察屏幕上的元素和正确的函数范围内的元素。
如果您想直接与链接交互,您应该考虑使用我前面提到的ajax钩子之一,页面交互性由前面提到的后端.js.erb文件提供。
发布于 2014-07-20 02:09:41
实际上,您的想法有点错误,因为js.erb将在向服务器发送新请求后执行,因此您将无法将它与当前的DOM元素链接起来。
为了实现您的目标,我认为您应该为每个链接分配一个唯一的ID,然后将该ID与请求params一起传递给服务器。然后在您的js.erb上,您将能够使用该ID来正确识别已单击的链接。
例如:
<%= link_to "Test link", some_path(link_id: "link_1"), remote: true, id: "link_1" %>
<%= link_to "Test link 2", some_path(link_id: "link_2"), remote: true, id: "link_2" %>控制器
def my_action
@link_id = params[:link_id]
endjs.erb
console.log($("#<%= @link_id %>"));发布于 2014-07-19 23:24:55
在Vanilla JavaScript中,回调函数中的addEventListener函数中的this是触发事件的元素。
请参考这个小提琴
标记:
<input type="button" value="Click Me" id="button" />JavaScript
document.querySelector('#button').addEventListener('click', function(e){
console.log(this);
})

https://stackoverflow.com/questions/24845835
复制相似问题