关于不引人注目的javascript我不明白的一件事

时间:2010-09-07 19:47:22

标签: javascript ruby-on-rails unobtrusive-javascript

我喜欢分离功能的想法,这似乎是未来的方式。

但我习惯在嵌入式语言(如Rails ERB或PHP)中将javascript集成到循环中,我可以在javascript中使用特定对象的ID作为参考。

Rails示例:

<% @comments.each do |comment| %>
  <div id="comment_<%= comment.id %>">
    <%= comment.text %>
    <% link_to_function "Reply", "$('comment_#{comment.id}').insert(\"#{escape_javascript(render :partial => "_form", :locals => {:comment => comment})}\", {position: 'bottom'});" %>
  </div>
<% end %>

这不是我唯一一次想要在javascript中使用Ruby方法的时候。我可能想要使用常量,或者在循环user.enabled?user.full_name内的对象上调用其他ruby方法,或者使用这些对象渲染部分等。

那么如果所有的javascript都在另一个文件中或在循环之外,那该怎么办呢?我知道你可以使用CSS选择器在javascript中迭代一堆div,但这不允许我在对象上调用ruby方法。

我错过了什么?谢谢!

5 个答案:

答案 0 :(得分:2)

我认为应该使用“data-id”参数完成,如此截屏视频中所示 http://railscasts.com/episodes/229-polling-for-changes

答案 1 :(得分:1)

对于您的特定示例,您已经在标记中编码了注释ID,因为您将div元素的ID属性设置为注释ID。所以你可以把JavaScript挂掉。

答案 2 :(得分:0)

请原谅我使用jquery,但是没有它或类似的库,网页开发真的很糟糕

对于您的第一次投诉(获取最新评论),javascript this可以正常使用。

onclick="my_function(this);"

和js文件

my_function = function(target) {
    // clicked element passed in
    // now, let's get comment element by class
    var comment = $(target).parents('.comment');
}

至于第二次投诉......我从来不经常需要它,但有时候我会在html中包含一些数据供javascript使用。扩展前面的例子:

<div class="comment" comment_id="<%= comment.id %>"></div>

并在my_function

var comment_id = comment.attr('comment_id');

答案 3 :(得分:0)

使您的客户端脚本将'options'对象作为参数。不要使用任何服务器端脚本;将脚本放在自己的.js文件中。

然后使用输出js的服务器端脚本创建'options'对象。包括你的脚本并调用它的入口点函数,传入你的'options'对象。

答案 4 :(得分:0)

你需要更多的JavaScript知识才能看到它的强大功能,尤其是jQuery。你的例子我会解决如下:

<% @comments.each do |comment| %>
  <div class="comment">
    <%= comment.text %>
    <a href="reply.php?id=<%= comment.id %>" class="reply">Reply</a>
  </div>
<% end %>
<script type="text/javascript">
  $('.comment .reply').click(function(e) {
    e.preventDefault();
    var url = $(this).attr('href');
    var result = url.match(/\?id=(\d+)([^\d]|$)/);
    var id = (result && result[1]);
    if (id) {
      // do whatever you want to do with the id
    }
  });
</script>

优点:

(1)你没有遍布各处的javascript

(2)没有javascript工作