【问题标题】:Javascript setTimeOut causing Access Denied ErrorJavascript setTimeOut 导致访问被拒绝错误
【发布时间】:2013-06-21 13:10:02
【问题描述】:

我有以下场景:

Main.aspx 页面 ---> AJAX Modal PopUp ---> iFrame ---> ASP.Net Master Page ---> Nested.aspx 页面

在 Nested.aspx 页面上,我有以下 JQuery 脚本:

             window.onload = function () 
            {
              setTimeout(function(){

              // Some Code here

              setTimeout(arguments.callee, 100);
              }, 100);
            }

当我关闭 Modal PopUp 时,一切都会正常运行几秒钟,然后我收到一个 javascript 错误“SCRIPT5:访问被拒绝”。

我认为正在发生的事情是,在页面关闭后计时器继续运行,并且它试图访问 iFrame 之外不再存在的表单,因此出现“拒绝访问”错误。

任何想法如何在模态关闭后停止计时器?我怀疑我必须通过 Nested.aspx 页面 window.unload 函数中的 javascript 来执行此操作,但不确定具体如何操作?

【问题讨论】:

  • 所有页面都来自同一个域吗?

标签: javascript jquery asp.net iframe


【解决方案1】:

你的代码与 JQuery 无关,话虽如此,你去吧:

var timer1,timer2;
window.onload = function () 
{
    timer1 = setTimeout(function(){

        // Some Code here

        timer2 = setTimeout(arguments.callee, 100);
    }, 100);
}

// add this where needed (form close?)
clearTimeout(timer1);
clearTimeout(timer2);

您还可以在 setTimeout 函数中添加 if 语句来检查表单是否确实存在。

【讨论】:

  • 没有具体的形式。当我说表单时,我基本上是指由 iFrame 托管的页面。
  • 当我关闭托管 iFrame 的模式时,不会调用 Nest.aspx 页面 windows.unload 函数。
  • 感谢您的帮助。它并没有完全解决问题,但引导我朝着正确的方向前进。 +1
  • 它必须在window.unload 函数上,我将计时器设为全局,所以基本上它们可以从关闭模式的相同函数中关闭。
【解决方案2】:

好的,为了解决这个问题,我从使用递归 setTimeout() 方法更改为使用本质上递归的 setInterval() 并解决了问题。

【讨论】:

  • setInterval 如您所说,是递归的,因此它可能会引发更多问题(代码将每 x 毫秒 recusivly 运行一次)并可能重新运行您的代码。此外,您可能必须使用clearInterval
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多