setTimeout无法在Chrome中运行

时间:2012-03-21 17:03:35

标签: javascript jquery html google-chrome webkit

这个问题适用于同事。他在Chrome中遇到了以下代码段的问题:

function showEmailClient(emailContent, url, providerContactId) {
    window.location = emailContent;
    if (providerContactId != undefined) {
        setTimeout(function() {
            clientSideRedirect(url + providerContactId);
        }, 5000);
    }
    else {
        setTimeout(function() {
            clientSideRedirect(url);
        }, 5000);
    }
}​

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

更新

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

2 个答案:

答案 0 :(得分:5)

window.location = emailContent;

一旦此行被击中,这将重定向浏览器。

答案 1 :(得分: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;
    }
}