2015-06-29 40 views
-1

我已经syntaxed检查了好几次,但无法弄清楚,为什么功能被递归调用:Infinte环路 - 添加和删除事件侦听

function updateNewClasses() { 
    function addNewClass() { 
    updateNewClasses(); 
    } 
    window.addEventListener("hashchange", addNewClass); 
    // Conditionals being skipped; no loops 
    window.removeEventListener("hashchange", addNewClass); 
    location.href = '#'; 
    window.addEventListener("hashchange", addNewClass); 
} 

程序保持调用哈希变化函数递归调用updateNewClass导致无尽的循环。

回答

3

由于您的addEventListenerupdateNewClasses是从addNewClass这是从触发叫你addEventListener你继续增加每次触发时的事件监听器。

此外,您updateNewClasses正在创建一个“新” addNewClass不上updateNewClasses任何后续调用删除。您需要存储您想要添加/删除以外回调范围的功能,以便将其删除。

也许你的意思是这样:

var addNewClass = function() { 
    updateNewClasses(); 
} 

var updateNewClasses = function() { 
    // Remove the old listener, change the hash, and add the listener again 
    window.removeEventListener("hashchange", addNewClass); 
    location.href = '#'; 
    window.addEventListener("hashchange", addNewClass); 
} 
+0

不工作..... – Isaiah

1

检查语法因为你的代码是语法正确会找不到错误。

你“updateNewClasses”功能执行以下操作:

  1. 添加的事件侦听器“hashchange”
  2. 删除事件侦听器
  3. 触发哈希变化
  4. 再次添加事件侦听器。

一旦从发生“hashchange”事件以外的函数,您将开始得到不良行为。对removeEventListener的调用只会将该调用开始时添加的处理程序移除到“updateNewClasses”;在任何先前调用结束时添加的事件监听器将保持有效,因为每次调用“updateNewClasses”都会生成一个全新的“addNewClass”函数实例。

+0

那么,我该如何解决这个问题?我试图让页面滚动到正确的位置,但我需要跟踪哈希变化 – Isaiah

+1

@Isaiah查看其他答案 - 如果确保“addNewClass”函数是唯一的,则调用removeEventListener()将删除涉及该函数的* all *监听器分配。 – Pointy