Сценарий Jquery ведет себя по-разному, когда ненавязчивый, чем в представлении рельсы
У меня есть это на мой взгляд
<script type='text/javascript'>
$(function(){
$('#users').click(function(){
alert($("tr[aria-selected=true] td:first").html())
})
})
</script>
И внутри моих users.js
$(function(){
$('#users').click(function(){
alert($("tr[aria-selected=true] td:first").html())
})
})
Наличие их, очевидно, не в одно и то же время, дает мне разные результаты. В основном, я пытаюсь получить идентификатор выбранной строки, найдя его значение attr.\
Ненавязчивым способом сразу после загрузки страницы я получаю "ноль" при первом щелчке строки, а затем каждый раз, когда я нажимаю на строку, отображается значение, которое я щелкнул ранее... ДВАЖДЫ!. Но когда я держу скрипт в поле зрения, я получаю желаемый результат.
Что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Мой взгляд
<%=raw jqgrid("List of users", "users", "/users",
[
{ :field => "id", :label => "id",:width => 50 },
{ :field => "username", :label => "username",:width => 120,:editable => true },
{ :field => "email", :label => "email",:width => 120,:editable => true },
{ :field => "name", :label => "name",:width => 100,:editable => true },
{ :field => "lastname", :label => "lastname",:width => 100,:editable => true },
{ :field => "groups", :label => "roles",:width => 180}
] , {:add => true,:edit => true,:delete => true,:error_handler => "s",:inline_edit => 'true',:edit_url => post_data_users_url,:sortable_rows => 'true'}
) %>
<p><%= link_to "Edit roles",roles_path%>
<%= link_to "| Edit user",{:action => 'edit'},{:class => 'editLink hide'}%></p>
<script type='text/javascript'>
$(function(){
var _last = new String()
$('#users').click(function(){
_last = $("tr[aria-selected=true] td:first").html()
$(".editLink").attr("href","/users/edit/"+ _last)
$(".editLink").addClass('show')
})
})
</script>
Мой макет
<!DOCTYPE html>
<html>
<head>
<title>UserManager</title>
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
<%=jqgrid_javascripts%>
<%=jqgrid_stylesheets%>
</head>
<body>
<div>
<%if flash[:notice]%>
<p><%= flash[:notice]%></p>
<%end%>
<%if current_user%>
Logged in as <%= current_user.username%> | <%= link_to 'logout', log_out_path%>
<%end%>
</div>
<%= yield %>
</body>
</html>
Как я вижу... ничего особенного
1 ответ
В зависимости от ваших требований к производительности, используйте.live('click', function(){}) вместо click(function(){}) или создайте функцию внутри вашего users.js, чтобы выполнить привязку и использовать обратный вызов для jqgrid для запуска.
В users.js
$(function(){
$('#users').live('click', function(){
alert($("tr[aria-selected=true] td:first").html())
})
})
Или в users.js:
function bindClickToRow(){
$(function(){
$('#users').click(function(){
alert($("tr[aria-selected=true] td:first").html())
})
})
}
Затем используйте его в обратном вызове jqgrid (я не знаю, как работает их API, и я не смог быстро это выяснить, но я уверен, что хороший плагин grid поддерживает это, так что рассматривайте это как псевдокод):
jQuery('table').jqgrid({
afterCreate: bindClickToRow
})
Надеюсь это поможет.
Насколько я понимаю, причина в том, что вы используете 'click', чтобы связать событие click с функцией. Но вы делаете это, когда самого факта еще не существует. Таким образом, вы в основном говорите jQuery, свяжите 'click' со всеми существующими сейчас.
Что произойдет, если вы используете 'live', хотя это эквивалентно сообщению jQuery о привязке этой функции к событию 'click' во всех текущих и будущих событиях, соответствующих вашему селектору.
Причина, по которой этот файл еще не существует, заключается в том, что jqgrid загружается после вызываемой привязки. Кроме того, jqgrid, вероятно, регулярно создает новые s, долгое время после вызова привязки click. Если вы используете 'live', jQuery будет следить за всеми новыми s и привязывать к ним функцию обратного вызова, как только они будут созданы.