在Chrome浏览器中,setTimeout无法正常工作

4
这个问题是为我的同事准备的。他在Chrome浏览器中遇到了以下代码片段的问题:
function showEmailClient(emailContent, url, providerContactId) {
    window.location = emailContent;
    if (providerContactId != undefined) {
        setTimeout(function() {
            clientSideRedirect(url + providerContactId);
        }, 5000);
    }
    else {
        setTimeout(function() {
            clientSideRedirect(url);
        }, 5000);
    }
}​

在Chrome中,setTimeout函数立即被调用,而不是等待它们应该等待的5秒。有什么想法吗?

更新

emailContent是一个mailto字符串,例如'mailto:support@somewhere.com',它会导致用户的默认邮件客户端打开,而不是重定向到页面。


控制台上有任何错误信息吗? - Andreas Wong
你在尝试做什么?你正在重定向...我相信这在所有浏览器中都会发生相同的情况。 - gdoron
对我来说可以运行:http://jsfiddle.net/Vy7cr/ - gen_Eric
1
你确定在这个函数中立即调用了clientSideRedirect,而不是其他地方吗? - apsillers
2个回答

5
window.location = emailContent;

这将会在代码执行此行时立即重定向浏览器。

2
Alex忘了提到emailContent是一个mailto字符串,而不是进行页面重定向。 - Halcyon
@Halcyon:好的,这就是我得到的全部内容。我已经在自己的电脑上测试了这段代码,它可以正常工作。http://jsfiddle.net/Vy7cr/ - gen_Eric
这对我也有效(http://jsfiddle.net/3XmVC/1/)。这个问题是为了我的同事。Troy,你有更多信息吗? - Chev
是的,没错 - 它在孤立的环境中运行得很好,但在开发环境中就失败了。我也想不出来! - Halcyon

2
根据我的经验,不要使用 window.location 来启动电子邮件客户端并在同一页上执行重定向 - 这是一个问题。相反,使用表单通过 System.Net.Mail 命名空间和其中的对象提交电子邮件,然后执行重定向。如果这不是一个选项,请将 mailto 数据存储在会话中,在重定向后页面加载时调用邮件客户端。这种方法的唯一注意事项是 window.location 将终止任何未写入的响应,因此您需要使用计时器事件通常约为 2000 毫秒(如果您的页面具有动态数据并且具有各种加载时间,则祝你好运!)给页面一些时间来加载。此代码片段使用 jQuery 等待文档准备就绪,并添加了 2000 毫秒以确保任何响应都已写入。
function showEmailClient(mailto)
{
    $(document).ready(function ()
    {
        setTimeout(function ()
        {
            window.location = mailto;
        }, 2000);               
    });
}

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["SendMail"] != null)
    {
        var mailto = Session["SendMail"].ToString();
        ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "ShowEmailClient", "showEmailClient('" + mailto + "');", true);
        Session["SendMail"] = null;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接