添加回调函数时 JavaScript 停止工作

Posted

技术标签:

【中文标题】添加回调函数时 JavaScript 停止工作【英文标题】:JavaScript stops working when a call back function is added 【发布时间】:2014-01-02 20:19:53 【问题描述】:

我的网页遇到了一个奇怪的问题。如果被调用的 javascript 函数在其中添加带有回调函数的语句,则附加到 href 的 JavaScript 会被正常调用并停止工作。在这种情况下,即使是作为从 href 调用的 JS 函数中的第一条语句放置的警报也不会触发。

这是一个例子: 跟随工作就好了。

点击此链接时

<a href = "#" onclick="getMyPosition(); return false;">refresh</a>,

following js func 被调用得很好,我看到 both 警告消息表明 getMyPosition() 已执行。注意:此时(即当 js 似乎正在工作时)回调函数(“handleposition”)是 NOT 定义的,但它不会引发任何错误!本身就很奇怪:)

function getMyPosition()  
  alert("it worked 1.");
  if ( navigator.geolocation )
  
    alert("it worked 2.");
    navigator.geolocation.getCurrentPosition(handlePosition, handleError, 
    enabledHighAccuracy: true,
    maximumAge: 60000,
    timeout:    30000
    );
  

现在,如果我在脚本块中添加以下函数,所有功能都将停止工作,并且似乎甚至单击了刷新链接。由于网页上的所有其他内容(包含附加到其他项目的 JavaScript 事件等)都可以正常工作,我的假设是页面上的 JavaSctipt 工作正常。只是这个链接停止调用 onClick 事件上定义的函数。

添加以下回调函数会导致行为就像“刷新”链接甚至没有被点击一样:

function handlePosition(pos)

  alert(pos.coords.latitude);
  alert(pos.coords.longitude);
  window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";

现在,如果删除此功能,上面显示的 href 链接将再次开始工作,getMyPosition 将被调用,我再次看到警报消息! 我在页面上没有看到任何脚本错误 IE 11 和 Chrome 都表现出这种行为。 我在 Windows 7 32 位机器上。

【问题讨论】:

你在哪里添加回调?您可以发布损坏场景的完整代码吗? 【参考方案1】:

最大的问题可能是地理定位回调缺少错误处理程序。通过 F12 调出 Chrome 的调试器很快就发现了问题。

添加错误处理程序似乎可以解决问题,但在此过程中我清理了其他一些东西。 Here's a fiddle showing it working

以下是我如何编写链接以在所有浏览器中工作:

<a href="#" onclick="return(getMyPosition())">refresh</a>

这里是句柄位置的修改后的 JS 代码和新的 handleError 例程。

注意添加到主函数中的“return false”:

function getMyPosition() 
    alert("it worked 1.");
    if (navigator.geolocation) 
        alert("it worked 2.");
        navigator.geolocation.getCurrentPosition(handlePosition, handleError, 
            enabledHighAccuracy: true,
            maximumAge: 60000,
            timeout: 30000
        );
    
    return false;


function handlePosition(pos) 
    alert(pos.coords.latitude);
    alert(pos.coords.longitude);
    window.location.href = "/map?js=y&amp;lat=" + pos.coords.latitude + "&amp;lon=" + pos.coords.longitude;


function handleError(error) 
    alert(error);

【讨论】:

谢谢。它成功了。该问题部分与 window.location.href 的地址格式错误有关。我很困惑为什么这个错误会导致整个 JS 块停止工作——包括第一个函数 windows.location.href 还没有被提及。此外,任何地方都没有报告脚本错误。很难调试这种看似奇怪的行为...... :) 不客气。未定义的错误处理程序在调用 getCurrentPosition 时抛出异常;只有在 getCurrentPosition 调用 handlePosition 之后,href 错误才会很明显。【参考方案2】:
window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";

应该是:

window.location.href = "/map?js=y&lat=" + pos.coords.latitude + "&lon=" + pos.coords.longitude;

【讨论】:

是的,问题与 window.location.href 的地址格式错误有关。我很困惑为什么这个错误会导致整个 JS 块停止工作——包括第一个函数 windows.location.href 还没有被提及。【参考方案3】:

return false;放在getMyPosition函数的最后

【讨论】:

为什么 OP 应该这样做?请说明问题和您的解决方案。 感谢您的回复。我在定义 onClick 的函数调用后返回 false,所以我认为在 getMyPosition 中也不需要它。

以上是关于添加回调函数时 JavaScript 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

C++:SDL 音频回调最终停止工作

使用javascript确认时,Asp.net requiredfieldvalidator停止工作

功能仍在执行任务时停止回调

停止并继续javascript函数[重复]

JavaScript里面怎么点击按钮让计时停止,再次点击时工作?

停止在movieclip actionscript 2上淡入淡出