Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有一件事我不知道';我不了解不引人注目的javascript_Javascript_Ruby On Rails_Unobtrusive Javascript - Fatal编程技术网

有一件事我不知道';我不了解不引人注目的javascript

有一件事我不知道';我不了解不引人注目的javascript,javascript,ruby-on-rails,unobtrusive-javascript,Javascript,Ruby On Rails,Unobtrusive Javascript,我喜欢分离功能的想法,这似乎是未来的发展方向 但我习惯于在嵌入式语言(如Rails ERB或PHP)中集成javascript内部循环,在这种语言中,我可以使用特定对象的ID作为javascript中的引用 Rails示例: <% @comments.each do |comment| %> <div id="comment_<%= comment.id %>"> <%= comment.text %> <% link_t

我喜欢分离功能的想法,这似乎是未来的发展方向

但我习惯于在嵌入式语言(如Rails ERB或PHP)中集成javascript内部循环,在这种语言中,我可以使用特定对象的ID作为javascript中的引用

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 %>

“_form”,:locals=>{:comment=>comment}}\,{position:'bottom'});”%>
这也不是我唯一一次希望在javascript中使用Ruby方法。我可能想在循环
user.enabled?
user.full\u name
中的对象上使用常量,或调用其他ruby方法,或使用这些对象呈现部分,等等

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


我错过了什么?谢谢

我认为应该使用“数据id”参数来完成,如本屏幕广播所示

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

对于您的第一个投诉(获取当前评论),javascript
这个
适合我

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>

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

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


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

您只需要更多的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>

$('.comment.reply')。单击(函数(e){
e、 预防默认值();
var url=$(this.attr('href');
var result=url.match(/\?id=(\d+)([^\d]|$)/);
变量id=(结果和结果[1]);
如果(id){
//你想用身份证做什么就做什么
}
});
好处:

(1) 你没有到处都是javascript


(2) 在外部javascript库或文件中使用Ruby方法时不使用javascript

,这意味着您只能在Ruby应用程序中使用这些库或文件。考虑查看jQuery;研究jQuery使用参数化解决此问题的方法。我将插入我自己关于此主题的博文:有意义,我可以获取id。但我仍然无法从ruby方法中生成文本,对吗?这允许您在javascript中获取id,但是你仍然不能在javascript中的对象上调用Ruby方法来生成文本。谢谢这个策略的某些地方仍然让我有点不舒服(它在rails和javascript参数之间增加了另一个步骤,这又是一个混乱的地方)。另外,将整个渲染部分放置在数据属性中有意义吗?我想你可以,只是看起来很奇怪。
<% @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>