[英]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&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.