【问题标题】:Basic questions about javascript关于javascript的基本问题
【发布时间】:2013-06-11 07:54:30
【问题描述】:

请看一下_form.html.erb中的以下代码:

<script>
    function typeCatch(){
      $.post("<%= update_readers_link_essay_path(@essay) %>");
      $(this).off("keypress", typeCatch);//remove handler
     }

  $(function(){
    ("form#new_revision").on("keypress", typeCatch);
  });
</script>

当用户开始输入表单时,应该触发 ajax 请求并更新读者列表。但是,当我开始输入表单并尝试调试此问题时,不会触发发布请求。

由于我对 javacsript 还不是很熟悉,如果您能帮助我澄清一些事情,我将不胜感激。

一个。对于第二部分,我可以做吗

$("form#new_revision").on("keypress", typeCatch);

不用$(function() {} 包裹它?

b.有什么我做错了吗?既然没有触发ajax调用,那我一定是在第二部分中犯了错误?

其他问题

my_personal_chat.js(在 app/assets/javascripts 管道中)

$(function() {
  var pusher = new Pusher('app_key');
  var channel = pusher.subscribe('presence-my-chat');

  channel.bind('pusher:subscription_succeeded', function(members) {
    $('#online_users').empty();
    members.each(function(member){
        addMember(member);
    });
... other functions ...
});

这就是我使用 Pusher 实现聊天功能的方式。由于通道是私有的,每次我调用var channel 时,都会调用POST /pusher/auth 的ajax 调用。

我发现每次导航到不同的页面时,即使它不在聊天功能所在的位置,也会调用POST /pusher/auth。基本上,每次 my_personal_chat.js 加载时,都会不必要地调用 ajax 调用。

问题:如何防止这种情况发生? my_personal_chat.js 应该只在我转到myapp.com/chat 时加载。我是否应该从 javascript 文件中提取所有内容并将其放入 chat.html.erb 中?这是传统的做法吗?

回答我自己的问题:我将代码从my_personal_chat.js 移动到chat.js.coffee 并删除了my_personal_chat.js。现在只有当用户进入聊天页面时才会加载 javascript。

【问题讨论】:

  • 你错过了来自("form#new_revision").on("keypress", typeCatch)的$
  • 又是你@FrederickCheung!非常感谢。是的,我添加了它,但问题仍然存在。另外,我不需要最后的分号吗?
  • 分号在 JS 中是可选的。
  • 是的,我真的应该这样做。仍在解决此问题,我将在解决此问题后立即标记为答案。

标签: javascript jquery ruby-on-rails


【解决方案1】:

一个。有替代方案,但是将代码包装在 $(function() {}) 中是确保在所有元素都加载到 DOM 之前不会执行代码的最佳方法之一。这是一个 jQuery 功能。

b. ("form#new_revision").on("keypress", typeCatch); 应该是 $("form#new_revision").on("keypress", typeCatch);。您在开头缺少$

【讨论】:

  • 我加载了 jquery 库并修复了一些 javascript 错误并且它可以工作。 jsfiddle.net/xEu8w
  • 感谢大家的帮助。问题是没有正确导入其他一些 javascript 文件,这导致此代码出错。还有一个问题。假设我有一个外部 javascript 文件 foo.js,并且我希望仅在到达某个页面 /foo 时才加载它。我将foo.js 放在app/assets/javascripts 目录中,每次导航到另一个页面时都会加载它。
  • 如果它正在被加载,即使您没有在 &lt;script&gt; 标记中提及它,这也不是标准的 Javascript 功能。如果是 RoR,我对此一无所知。
  • 这是由于 Rails 中的资产管道。如果您查看 /app/assets/javascripts/application.js,您将看到一个 require_tree 指令 - 这将自动为您加载 javascripts 文件夹中的每个 javascript 文件。有关资产管道的更多信息:guides.rubyonrails.org/asset_pipeline.html
  • @sevenseacat 谢谢。我知道资产管道,我想知道如何处理“特定于控制器的”javascript 文件。我可以在stackoverflow.com/questions/6167805/… 找到答案,但只有在我摆脱require_tree 之后才有用。这将导致手动配置 javascript 导入,所以我只是恢复到在我的视图文件中执行 &lt;script&gt;whatever&lt;/script&gt;
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多