Сценарий 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 и привязывать к ним функцию обратного вызова, как только они будут созданы.

Другие вопросы по тегам