我是 JavaScript 新手,试图了解为什么我的 on 事件监听器不起作用。我在 stackoverflow 上找到了类似的帖子,但这些解决方案对我不起作用。
var search = function( event ) {
alert("bobo")
$.get("http://localhost:3000/search", {"search" : $("#Search-Bar").val()}, function(data, status){
if(status == "success")
$(".centering.text-center").html(data)
})
}
var attachListeners = function(){
$("#Search").on("click", search)
$("#SearchIcon").click( () => search() )
$("#Search-Bar").keypress( event => (event.KeyCode == 13 || event.which == 13) ? search() : undefined )
}
$(document).ready( function(){
attachListeners()
})
我的网站不是单页应用程序。我已将监听器附加到我的导航搜索栏,在其中通过导航链接加载不同的 View ,并且我的服务器(ruby 后端)上传一个新的 html 页面。
在第一次加载时,我注意到文档准备被调用,并且其他一切都正常。打开并单击。在我使用导航并加载不同的 html 页面后,我的事件消失了。在我的 html View 中,我的搜索栏、搜索图标和搜索文本具有一致的 id
已经结束了我尝试过使用 window.load()
并为我的 body 添加 onload 属性 <body onload=attachListeners()>
但都不起作用(也许我没有正确使用它们)。我还注意到,当我渲染下一个 html View 时,我的 docment.ready
没有被调用。但是,如果我使用 F5 强制刷新页面,该 html 页面的监听器将再次处于事件状态。我在这里错过了什么我不明白的事情?
最佳答案
看起来您可能正在使用 Turbolinks ,来自该项目的自述文件:
When you follow a link, Turbolinks automatically fetches the page, swaps in its <body>, and merges its <head>, all without incurring the cost of a full page load.
由于这个库使得页面只加载一次,所以正常的 javascript window.onload
、DOMContentLoaded
和 jQuery ready
事件不会初始页面加载后无法运行,您必须使用
document.addEventListener("turbolinks:load", function() {
而不是那些。如果您不熟悉 Turbo Link,我建议您阅读该自述文件以了解其全部内容。
我从来不明白为什么 Rails 团队会把这样的东西放在 Rails 中并默认启用它,自从他们进行更改以来,在我所做的每个项目中,我做的第一件事就是卸载它,当我忘了这样做,我在项目中花了几个小时后想知道为什么我的 javascript 被破坏了。
关于加载另一个页面后 JavaScript 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47299292/