2014-07-19 2 views
-1

Как правило, в чистом js или jquery или в контексте рельсов, как вы получаете элемент DOM, который был нажат?Как получить нажатый элемент DOM?

Обычно вы делаете что-то подобное, что позволяет использовать $(this).whatever_method

$(#something).on('click', function() 
{ 
    $(this).do_something; 
}_; 

Но в моем случае, у меня есть ссылка в моем HTML, удаленный: верно, и в моем контроллере я вынести JS. erb-файл. В таком сценарии все javascript-коды в файле js.erb выполняются. Нет места для прослушивателя кликов, поскольку единственная причина, по которой этот файл 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. 
+0

Что делает ваш контроллер задней панели при создании клиентской стороны слушателя событий? Опубликуйте соответствующие html и объясните проблему, имеющуюся у вас в ссылке на источник на стороне клиента – charlietfl

+0

, поскольку в этом случае избыточное добавление прослушивателя кликов излишне. Я вызываю файл js.erb для выполнения, щелкая ссылку, направляющую маршруты в файл js.erb. – ahnbizcad

+0

Если бы я включил javascript в папку с ресурсами, я бы добавил слушателей событий щелчка и выполнил его блок кода при нажатии. Но в этом случае файл js.erb, представляющий собой представление, отображаемое контроллером, выполняется немедленно. Я думаю, что это означало бы добавление слушателя событий, это не правильный путь, не так ли? – ahnbizcad

ответ

2

Ajax

Даже если вы используете remote: true, есть еще место для click слушателя. Вы, вероятно, лучше всего с помощью ajax hooks с элементом, который инициирует вызов удаленного АЯКС:

$(document").on("ajax:beforeSend", "#your_element", function(){ 
    $(this).hide(); -> hides element 
}); 

Я думаю, что вы будете в состоянии использовать это по вяжущего .click событий в вашем примере. Причина быть, хотя вы может позвонить click, он по существу не имеет никакого отношения к вызову ajax; в то время как с помощью одного из ajax hooks будет иметь определенное влияние на это

-

Rails

В отношении вашего Rails бэкэнда (ваш .js.erb файл), вы просто не сможете ссылаться $(this) с этой частью вашего приложения. Причина в том, JS работает с DOM - то есть он может только наблюдать как элементы на экране и те в правильной области видимости функции

Если вы хотите, чтобы взаимодействовать со ссылками непосредственно, вы должны смотреть на использование одного из ajax hooks, о которых я упоминал выше, с интерактивностью страницы, предоставленной бэкендом .js.erb файл, упомянутый

1

В Vanilla JavaScript this в функции обратного вызова функции addEventListener - это элемент, инициировавший событие.

Пожалуйста, обратитесь эту fiddle

Разметка:

<input type="button" value="Click Me" id="button" /> 

JavaScript

document.querySelector('#button').addEventListener('click', function(e){ 
    console.log(this); 
}) 

demo(gig)

+0

Можете ли вы привести мне пример? – ahnbizcad

+0

, поэтому добавление 'addEventListener' не требуется, если вы просто пытаетесь манипулировать полученным объектом, правильно? Этот скрипт в моем случае выполняется после того, как я щелкнул по нормальной ссылке, которую я сказал рельсам, чтобы вызвать javascript-файл при нажатии. – ahnbizcad

+0

, когда файл js.erb отображается рельсами, код внутри выполняется немедленно. правильно ли добавить прослушиватель событий, когда весь файл уже настроен на выполнение? – ahnbizcad

2

На самом деле, ваш образ мышления немного неправильно, потому что js.erb будет выполняется после отправки нового запроса на сервер , поэтому вы не сможете связать его с текущим элементом DOM.

Для достижения вашей цели, я думаю, вам следует назначить каждой ссылке уникальный идентификатор, а затем передать этот идентификатор на сервер вместе с параметрами запроса. И затем на вашем js.erb вы сможете использовать этот идентификатор, чтобы правильно идентифицировать ссылку.

Ex:

<%= 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] 
end 

JS.Еврорадио

console.log($("#<%= @link_id %>")); 
Смежные вопросы