jQuery 事件处理程序在离开视图时停止工作

Posted

技术标签:

【中文标题】jQuery 事件处理程序在离开视图时停止工作【英文标题】:jQuery event handlers stop working upon leaving view 【发布时间】:2016-06-04 00:10:05 【问题描述】:

我正在与 javascript 一起实现 Rails audio_tag:

<%= audio_tag current_word.sound, autoplay: true, class: "audio-play" %>
<button type="button" class="btn btn-default btn-lg", id="audioButton">
  <span class="glyphicon glyphicon-play" aria-hidden="true"></span>
</button>

jQuery(document).ready(function() 
    $("#audioButton").on("click", function() 
        $(".audio-play")[0].currentTime = 0;
        return $(".audio-play")[0].play();
    );
);

当我在站点刷新后进入页面或重新加载页面时,这很有效。否则,如果我点击离开并从菜单返回,将会有一个初始自动播放,并且按钮会显示但在点击时不起作用。在这种情况下如何保持 jQuery 加载?

【问题讨论】:

你确定return在这里的正确用法吗?你会删除它并重新测试吗? 我尝试删除它并得到相同的结果。 如果您使用的是 chrome,请尝试使用大写字母 P!​​ 【参考方案1】:

如果元素动态变化,请使用事件委托。

代替:

$("#audioButton").on("click", function() 

用途:

$(document).on("click", "#audioButton", function() 

【讨论】:

哦不,我很困惑。你说得对,我的回答不对。所以我马上删!来源:api.jquery.com/on【参考方案2】:

您几乎肯定会遇到 TurboLinks,它绕过了您的 jQuery(document).ready 回调。

如果您只想关闭 TurboLinks(因为它速度极快,但确实有一些烦人的效果),您只需编辑您的 app/assets/javascripts/application.js 文件并删除此行:

//= require turbolinks

这将在您的应用程序中禁用 TurboLinks,并且您现有的代码应该可以正常工作。

但是,如果您想在您的应用程序中继续使用 TurboLinks,您还需要处理页面动态更新时的特殊事件。事件是“page:load”和“page:restore”,应该以与jQuery(document).ready 回调相同的方式处理。

我通常将所有这些都包含在我的 html 页面 &lt;body&gt; 底部的一个小脚本中,如下所示:

<body>
  <!-- important body stuff -->
  <script>
  jQuery(document).ready(onThisPageReady);
  jQuery(document).on('page:load', onThisPageReady);
  jQuery(document).on('page:restore', onThisPageReady);
  </script>
</body>

在 Javascript(或 CoffeeScript)源代码中,您可以包括:

function onThisPageReady() 
    $("#audioButton").on("click", function() 
        $(".audio-play")[0].currentTime = 0;
        return $(".audio-play")[0].play();
    );

现在,您可以在所有情况下进行页面初始化。 TurboLinks 提供了更多您可以注册的活动,如果您愿意,可以在此处找到完整列表:TurboLinks Events。如果您正在启动 Rails 5 应用程序,TurboLinks 的版本是新的,并且有一组完全不同的事件要注册,您可以在TurboLinks 5 Full List of Events 中找到。

【讨论】:

【参考方案3】:

尝试直接调用,不用document.ready

$("#audioButton").on("click", function() 
    $(".audio-play")[0].currentTime = 0;
    return $(".audio-play")[0].play();
  );

【讨论】:

以上是关于jQuery 事件处理程序在离开视图时停止工作的主要内容,如果未能解决你的问题,请参考以下文章

频繁的GET请求停止实际处理HTTP处理程序/离开返回相同的值

停止 SKSpriteNode 离开视图 (Swift)

IB_DESIGNABLE 使 Xcode 在离开情节提要时停止响应

event.preventDefault 如何在无法停止的事件处理程序上工作?

停止 jQuery Mobile 滑动事件双冒泡

删除侦听器类不会停止与 Jquery Javascript 相关的声音事件