【问题标题】:Open new https browser window using javascript使用 javascript 打开新的 https 浏览器窗口
【发布时间】:2010-07-30 09:58:11
【问题描述】:

我在 C# 代码中添加了一个 onclick 客户端事件处理程序。 它应该这样做:

  Button1.Attributes.Add("onclick", "javascript:window.open('https://"+Request.ServerVariables["HTTP_POST"]+"/reports/?type=1&id=2");

最后的 URL 是这样的:

https://servername/reports/?type=1&id=2

在我网站的报告文件夹中,我有一个处理这些参数的默认 aspx 页面。

当我单击带有此事件的按钮时,会打开一个新窗口,但它显示该地址没有页面。当我使用这样的链接时

https://servername/reports/default.aspx?type=1&id=2

页面打开,但它是空白的。

当我使用 HTTP 作为非安全代码运行此代码时,一切正常。报告打开。

使用带有 default.aspx 和没有它的这两个不同的 URL 有什么区别,因为在开发中它的行为方式相同,但是在 HTTPS 下一个页面不存在而另一个页面是空白的?! 是 HTTPS 的原因吗??

谢谢!

【问题讨论】:

  • 这可能与window.open 无关。如果您直接输入其中一个 URL 会发生什么?
  • 与代码相同。一种方式没有显示,另一种方式不存在。输入任何其他 url 会打开该页面,但这两个页面不会。我无法使用调试来查看发生了什么,因为这是在生产中,并且日志文件有问题,但无论如何这个错误..我很困惑..你认为它与 url 本身或 https 有关吗?

标签: javascript asp.net https


【解决方案1】:

您可能还想在脚本中添加 return=false。

    String s= "window.open('" + Request.Url.AbsoluteUri.Replace("http", "https") + "');return false;";
    ButtonTest.Attributes.Add("onclick", s);

【讨论】:

  • 它最终与 javascript 或 https 无关。奇怪的事情正在发生。 IIS 中的设置在它运行的服务器和不运行的服务器上是相同的。该页面上有水晶报表查看器。在两台机器上,CR 的安装方式相同,并且还有另一个报告页面也在运行 CR。我不知道,这不再是一个问题。我怀疑任何人都可以提供帮助。这可能是我们看不到或我不知道的 IIS 的问题。我只知道我正在失去理智。 Tnx 反正!
【解决方案2】:

找到了解决方案,除了哇,我无话可说! 它与ssl或IIS或路径无关,它与windows temp文件夹的权限有关,水晶报表无法保存临时文件。

希望这会对某人有所帮助。

【讨论】:

    【解决方案3】:
    • JavaScript 不会在字符串文字中插入变量名。您实际上是在使用服务器名称 Request.ServerVariables["HTTP_POST"],由于这不是真正的服务器名称(甚至在 URL 中有效),它不会打开。

    • JavaScript 是一种客户端语言,它无法访问Request.ServerVariables。您需要使用模板将 ASP 中的变量输出到客户端文档中,如果您将某些内容放入 JavaScript 字符串文字中,您通常应该是 JSON 编码,以停止 '\ 字符(以及其他几个)在文本中打破字符串。如果要输出到 HTML 事件处理程序属性中的 JavaString 字符串文字,则必须先对字符串进行 JSON 编码,然后再对其进行 HTML 编码。将内容放入事件处理程序所涉及的转义层令人讨厌且容易出错。通过不使用事件处理程序属性来避免它。

    • 您可能指的是HTTP_HOST,而不是POST

    • 事件处理程序中不需要javascript:;它什么也没做。您正在考虑链接中的 javascript: 伪 URL,但您也不应该使用它们。将真实的 URL 放在一个普通的链接中,这样它仍然可以在禁用 JavaScript 的情况下工作,并且不会因中键等选项而中断,然后使用 JS 来扩充链接,以便在正常单击时在新窗口中打开。

    这被称为“渐进式增强”:

    <a class="newwindow" href="https://<%= Server.HTMLEncode(Request.ServerVariables["HTTP_POST"]) %>/reports/?type=1&amp;id=2">
    
    <!-- at end of document -->
    <script type="text/javascript">
        for (var i= document.links.length; i-->0;)
            if (document.links[i].className==='newwindow')
                document.links[i].onclick= newWindowClick;
    
        function newWindowClick() {
            var w= window.open(this.href);
            return !w || w.closed;
            // stops link being followed in the current page (return false)
            // unless pop-up was blocked
        }
    </script>
    

    (在 ASP.NET 4 中,您可以使用 &lt;%: 而不是 &lt;%= 以避免需要 Server.HTMLEncode 任何内容。主机名中可能不会包含任何 HTML 特殊字符,但它是习惯 HTML 编码的好习惯,因为在任何更关键的地方都错过了它,而且您自己的 HTML 注入可能会导致 XSS 安全漏洞。)

    然而,这通常被认为是一种老式的模板方式; ASP.NET HTML 控件通常是首选。您还应该考虑简单地使用 target="_blank" 属性而不是所有 JS 复杂性。 (虽然它在 HTML 4 Strict 中无效,但它又回到了 HTML5 中并且更易于维护。)

    <asp:HyperLink id="thelink" Target="_blank" Text="some link text"/>
    
    // VBS in Page_Load:
    thelink.NavigateUrl= "https://" & Request.ServerVariables["HTTP_POST"] & "/reports/?type=1&id=2";
    

    最后,您还绝对应该考虑完全不使用弹出窗口。许多用户认为它是敌对的(如果我想在新窗口中打开它,我会点击“在新窗口中打开”)。此外,在某些浏览器中,它会在新标签页中打开,而不是在新窗口中打开,这可能是您不想要的。

    【讨论】:

    • 很抱歉,我没有输入它应该输入的最重要的链接。再次检查问题的顶部。事件处理程序是从代码添加的,而不是 html。它再次在测试环境中与 http 一起正常工作。 Https是生产问题。这变得如此紧张!星期一是这一天,这不起作用:(感谢您这么长的回答,但我在这里找不到答案。
    • 如果这是现在的实际代码:您在属性值的末尾缺少')。但这仅仅说明了为什么你不应该这样做,它令人困惑,容易逃避问题,而且难以阅读。将 JS 踢出静态代码,将 URL 保留在正常链接中。如果你愿意,你可以把它设计成一个按钮。 (永远,永远不要使用javascript:。)
    • 这不是实际代码,我正在从另一台计算机重新键入它,这就是为什么会有错字。 Txn 的建议,但我认为这与 https 有关,因为在常规的非安全环境中它工作得很好。 :(
    • 他在服务器端构建脚本,因此它不会包含字面上的代码。
    • 那你要不要保存一个我们可以实际调试的真实测试用例呢?否则就是浪费大家的时间。我可以向您保证,您没有理由不能使用window.openhttps: URL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多