【问题标题】:IE Hangs on Second Time a Value is Passed to a Parent Window with JavascriptIE 在第二次使用 Javascript 将值传递给父窗口时挂起
【发布时间】:2010-07-20 23:16:43
【问题描述】:

我有一个 ASP.NET 3.5 Web 应用程序,我试图将字符串从子窗口返回到父窗口。它适用于 FF、Chrome 和 Safari,但 IE 则不同。在 IE 中,它第一次工作,但是当重新打开子页面并传递另一个字符串时,父页面挂在 PostBack 的中间。

对于父窗口 ascx,我有以下内容:

<script type="text/javascript">
    function openMediaManager() {
        // This is called to open the child window.
        window.open('/mediamanager.aspx', 'mediamanager', 'width=685, height=530');
    }

    function setImagePath(img) {
        // This is called by the child window to pass the string to the parent.
        <asp:Literal ID="NewImgPostBack" runat="server" />
    }
</script>

以及来自后面代码的 sn-p 以生成 __doPostBack() 调用:

protected override void Render(HtmlTextWriter writer)
{
    // Not using the Button's OnClick because I have to use FindControl() to get the button.
    string postBack = Page.ClientScript
        .GetPostBackEventReference(MediaManagerButton, string.Empty)
            .Replace("''", "{0}");

    NewImgPostBack.Text = string.Format(postBack, "img");

    base.Render(writer);
}

在子 ascx 中,我使用文件路径调用以下函数(例如:“/image.png”):

<script type="text/javascript">
    function sendValueToParent(path) {
        // Called by the child to pass a string (path to an image) to the parent.
        window.opener.setImagePath(path);
        window.close();
    }
</script>

任何想法为什么这只会挂在 IE 中?我使用的是 IE 7,但我也在 IE 6 中看到了同样的问题(大多数最终用户都会遇到)。

类似问题的参考: Why does Internet Explorer 7 hang bizarrely when child window scripts the parent window to submit?

编辑

如果我在页面似乎挂在 IE 中时查看父级的源(子级已关闭),我会看到以下内容:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>title
</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><link id="ctl00_SiteStyle" rel="stylesheet" type="text/css" href="/App_Themes/20/css/a.css?v=3.0.0.1" />

    <script type="text/javascript" src="/javascript/_common.js"></script>

    <script type="text/javascript" src="/javascript/_calendar.js"></script>
</head>
<body>
    <form name="aspnetForm" method="post" action="/home.aspx" id="aspnetForm">
    <div>
    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMTY1ODQ0NjQxD2QWAmYPZBYEAgEPZBYCAgMPFgIeBGhyZWYFJy9BcHBfVGhlbWVzL1NCMjAvY3NzL2FtbGkuY3NzP3Y9My4wLjAuMWQCAw9kFgoCAQ9kFgYCAQ8PFgQeBFRleHQFCURFViBMb2dpbh4HVmlzaWJsZWhkZAIDDw8WBh8BBQhIVFRQIEdFVB4LTmF2aWdhdGVVcmwFCi9ob21lLmFzcHgfAmdkZAIFDw8WBB8BBQZMb2cgSW4fAmhkZAIFD2QWBAIDD2QWAgIBD2QWCGYPDxYCHwJnZBYEZg8PFgYeCEltYWdlVXJsBR8vaW1hZ2VzL2Ntc2ljb25zL2VkaXRfc21hbGwucG5nHghDc3NDbGFzcwURQ01TRWRpdE1lbnVfSW1hZ2UeBF8hU0ICAhYCHgtvbm1vdXNlb3ZlcgUzZGlzcGxheU1lbnUoJ2N0bDAwX0NvbnRlbnRNYWluX2N0bDAxX2N0bDAwX2N0bDAxJyk7ZAIBDw8WBB8FBRRDTVNFZGl0TWVudV9NYWluTWVudR8GAgIWBB8HBRVkaXNwbGF5TWVudSh0aGlzLmlkKTseCm9ubW91c2VvdXQFEmhpZGVNZW51KHRoaXMuaWQpOxYOZg8PFgQfBQUaQ01TRWRpdE1lbnVfTWVudUl0ZW1CdXR0b24fBgICFgQfBwUXdGhpcy5vZmZzZXRQYXJlbnQubW89MTsfCAUXdGhpcy5vZmZzZXRQYXJlbnQubW89MDsWAmYPDxYEHwUFGUNNU0VkaXRNZW51X01lbnVJdGVtUGFuZWwfBgICFgQfBwUadGhpcy5jbGFzc05hbWU9J01JUEhvdmVyJzsfCAUSdGhpcy5jbGFzc05hbWU9Jyc7FgRmDw8WBh8EBSMvaW1hZ2VzL2Ntc2ljb25zL2VkaXRtb2RlX3NtYWxsLnBuZx8FBRlDTVNFZGl0TWVudV9NZW51SXRlbUltYWdlHwYCAmRkAgEPDxYGHwEFBEVkaXQfBQUYQ01TRWRpdE1lbnVfTWVudUl0ZW1UZXh0HwYCAmRkAgEPDxYEHwUFGkNNU0VkaXRNZW51X01lbnVJdGVtQnV0dG9uHwYCAhYEHwcFF3RoaXMub2Zmc2V0UGFyZW50Lm1vPTE7HwgFF3RoaXMub2Zmc2V0UGFyZW50Lm1vPTA7FgJmDw8WBB8FBRlDTVNFZGl0TWVudV9NZW51SXRlbVBhbmVsHwYCAhYEHwcFGnRoaXMuY2xhc3NOYW1lPSdNSVBIb3Zlcic7HwgFEnRoaXMuY2xhc3NOYW1lPScnOxYEZg8PFgYfBAUmL2ltYWdlcy9jbXNpY29ucy9kaXNwbGF5bW9kZV9zbWFsbC5wbmcfBQUZQ01TRWRpdE1lbnVfTWVudUl0ZW1JbWFnZR8GAgJkZAIBDw8WBh8BBQdEaXNwbGF5HwUFGENNU0VkaXRNZW51X01lbnVJdGVtVGV4dB8GAgJkZAIDDw8WBB8FBRpDTVNFZGl0TWVudV9NZW51SXRlbUJ1dHRvbh8GAgIWBB8HBRd0aGlzLm9mZnNldFBhcmVudC5tbz0xOx8IBRd0aGlzLm9mZnNldFBhcmVudC5tbz0wOxYCZg8PFgQfBQUZQ01TRWRpdE1lbnVfTWVudUl0ZW1QYW5lbB8GAgIWBB8HBRp0aGlzLmNsYXNzTmFtZT0nTUlQSG92ZXInOx8IBRJ0aGlzLmNsYXNzTmFtZT0nJzsWBGYPDxYGHwQFHy9pbWFnZXMvY21zaWNvbnMvdW5kb19zbWFsbC5wbmcfBQUZQ01TRWRpdE1lbnVfTWVudUl0ZW1JbWFnZR8GAgJkZAIBDw8WBh8BBQRVbmRvHwUFGENNU0VkaXRNZW51X01lbnVJdGVtVGV4dB8GAgJkZAIFDw8WBB8FBRpDTVNFZGl0TWVudV9NZW51SXRlbUJ1dHRvbh8GAgIWBB8HBRd0aGlzLm9mZnNldFBhcmVudC5tbz0xOx8IBRd0aGlzLm9mZnNldFBhcmVudC5tbz0wOxYCZg8PFgQfBQUZQ01TRWRpdE1lbnVfTWVudUl0ZW1QYW5lbB8GAgIWBB8HBRp0aGlzLmNsYXNzTmFtZT0nTUlQSG92ZXInOx8IBRJ0aGlzLmNsYXNzTmFtZT0nJzsWBGYPDxYGHwQFIS9pbWFnZXMvY21zaWNvbnMvcmVtb3ZlX3NtYWxsLnBuZx8FBRlDTVNFZGl0TWVudV9NZW51SXRlbUltYWdlHwYCAmRkAgEPDxYGHwEFBlJlbW92ZR8FBRhDTVNFZGl0TWVudV9NZW51SXRlbVRleHQfBgICZGQCBg8PFgQfBQUaQ01TRWRpdE1lbnVfTWVudUl0ZW1CdXR0b24fBgICFgQfBwUXdGhpcy5vZmZzZXRQYXJlbnQubW89MTsfCAUXdGhpcy5vZmZzZXRQYXJlbnQubW89MDsWAmYPDxYEHwUFGUNNU0VkaXRNZW51X01lbnVJdGVtUGFuZWwfBgICFgQfBwUadGhpcy5jbGFzc05hbWU9J01JUEhvdmVyJzsfCAUSdGhpcy5jbGFzc05hbWU9Jyc7FgRmDw8WBh8EBSEvaW1hZ2VzL2Ntc2ljb25zL2luc2VydF9zbWFsbC5wbmcfBQUZQ01TRWRpdE1lbnVfTWVudUl0ZW1JbWFnZR8GAgJkZAIBDw8WBh8BBQZJbnNlcnQfBQUYQ01TRWRpdE1lbnVfTWVudUl0ZW1UZXh0HwYCAmRkAggPDxYEHwUFGkNNU0VkaXRNZW51X01lbnVJdGVtQnV0dG9uHwYCAhYEHwcFF3RoaXMub2Zmc2V0UGFyZW50Lm1vPTE7HwgFF3RoaXMub2Zmc2V0UGFyZW50Lm1vPTA7FgJmDw8WBB8FBRlDTVNFZGl0TWVudV9NZW51SXRlbVBhbmVsHwYCAhYEHwcFGnRoaXMuY2xhc3NOYW1lPSdNSVBIb3Zlcic7HwgFEnRoaXMuY2xhc3NOYW1lPScnOxYEZg8PFgYfBAUfL2ltYWdlcy9jbXNpY29ucy9z

(完)

您认为这可能是一些 ViewState 问题吗?有时,当我打开 IE 窗口时,大约 5 分钟后,它似乎超时并加载了一个没有样式的页面。

【问题讨论】:

    标签: c# asp.net javascript internet-explorer cross-browser


    【解决方案1】:

    这只是一个猜测 - 但也许尝试在开启器中保留对窗口的引用:

    var mediaMan;
    function openMediaManager() {
        // This is called to open the child window.
        if (mediaMan)
          alert("already open!");
        else
           mediaMan = window.open('/mediamanager.aspx', '', 'width=685, height=530');
    }
    

    然后,不是在 sendValueToParent 中关闭窗口,而是在 setImagePath 中关闭它

    function setImagePath(path) {
       // do whatever
       if (mediaMan)
       {
         mediaMan.close();
         mediaMan = null;
       }
    }
    

    我经常发现在 ie 中使用不同的方法可以工作 - 如果我发现这样的问题。使用此方法,您还可以检查一个媒体管理器是否已打开(从而无需命名窗口并允许您的网页的两个实例,而其中一个不会干扰另一个)。

    【讨论】:

    • 好主意,但结果相同。
    • 你知道它到底挂在哪里吗?尝试在 close() 之前添加警报;还是不是事件到达 setImagePath()?
    • 它正在到达 setImagePath() 并点击 close()。它似乎挂在服务器端......?我编辑了问题以提供有关挂起的更多详细信息。
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多