簡體   English   中英

使用JavaScript打開新的https瀏覽器窗口

[英]Open new https browser window using javascript

我在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的原因嗎?

謝謝!

您可能還想在腳本中添加return = false。

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

找到解決方案,除了“哇”,我無話可說! 它與ssl或IIS或路徑無關,與Windows temp文件夾上的權限有關,Crystal Report無法保存臨時文件。

希望這會幫助某人。

  • 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中,可以使用<%:而不是<%=以避免對Server.HTMLEncode任何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";

最后,您也絕對應該考慮完全沒有彈出窗口。 許多用戶認為它具有敵意性(如果我想要在新窗口中使用它,則可以單擊“在新窗口中打開”)。 另外,在某些瀏覽器中,它可能會在新標簽頁中打開,而不是在您可能不希望的新窗口中打開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM