Я использую Rails и jQuery, совершая ajax-вызов, инициируемый нажатием ссылки. Я установил файл application.js так, чтобы он выглядел как предложенный здесь , и он прекрасно работает. Проблема в том, как я могу использовать $ (this) в моем файле say .. update.js.erb для представления ссылки, на которую я нажал? Я не хочу присваивать идентификатор каждому, а затем перекомпилировать этот идентификатор в сценарии обратного вызова.
EDIT
Чтобы привести простой пример чего-то похожего на то, что я пытаюсь сделать (и гораздо проще объяснить): если пользователь нажимает на ссылку, которая удаляет этот элемент из списка, контроллер обрабатывает обратный вызов и обратный вызов (что здесь обсуждается) удалит элемент, на который я нажал, поэтому в обратном вызове delete.js.erb просто скажет $ (this) .fadeOut (); Вот почему я хочу использовать $ (this), чтобы мне не нужно было присваивать идентификатор каждому элементу (что было бы концом света, просто более подробная разметка)
application.js
jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript,application/javascript,text/html")} })
function _ajax_request(url, data, callback, type, method) {
if (jQuery.isFunction(data)) {
callback = data;
data = {};
}
return jQuery.ajax({
type: method,
url: url,
data: data,
success: callback,
dataType: type
});
}
jQuery.extend({
put: function(url, data, callback, type) {
return _ajax_request(url, data, callback, type, 'PUT');
},
delete_: function(url, data, callback, type) {
return _ajax_request(url, data, callback, type, 'DELETE');
}
});
jQuery.fn.submitWithAjax = function() {
this.unbind('submit', false);
this.submit(function() {
$.post(this.action, $(this).serialize(), null, "script");
return false;
})
return this;
};
// Send data via get if <acronym title="JavaScript">JS</acronym> enabled
jQuery.fn.getWithAjax = function() {
this.unbind('click', false);
this.click(function() {
$.get($(this).attr("href"), $(this).serialize(), null, "script");
return false;
})
return this;
};
// Send data via Post if <acronym title="JavaScript">JS</acronym> enabled
jQuery.fn.postWithAjax = function() {
this.unbind('click', false);
this.click(function() {
$.post($(this).attr("href"), $(this).serialize(), null, "script");
return false;
})
return this;
};
jQuery.fn.putWithAjax = function() {
this.unbind('click', false);
this.click(function() {
$.put($(this).attr("href"), $(this).serialize(), null, "script");
return false;
})
return this;
};
jQuery.fn.deleteWithAjax = function() {
this.removeAttr('onclick');
this.unbind('click', false);
this.click(function() {
$.delete_($(this).attr("href"), $(this).serialize(), null, "script");
return false;
})
return this;
};
// This will "ajaxify" the links
function ajaxLinks(){
$('.ajaxForm').submitWithAjax();
$('a.get').getWithAjax();
$('a.post').postWithAjax();
$('a.put').putWithAjax();
$('a.delete').deleteWithAjax();
}
show.html.erb
<%= link_to 'Link Title', article_path(a, :sentiment => Article::Sentiment['Neutral']), :class => 'put' %>
Сочетание этих двух вещей вызовет update.js.erb в рельсах, код в этом файле используется в качестве обратного вызова ajax (в данном случае $ .put)
update.js.erb
// user feedback
$("#notice").html('<%= flash[:notice] %>');
// update the background color
$(this OR e.target).attr("color", "red");