2011-03-30 124 views
1

我有一個允許用戶選擇支票的表單,當提交時,會創建一個PDF,並在新的瀏覽器選項卡中打開。它沒有任何品牌,並且可能會在插件中打開,所以我不希望它接管我的網站的選項卡。所以我將表格的target設置爲_blank你可以選擇瀏覽器目標服務器端嗎?

但是用戶可能提交沒有足夠信息來創建PDF的表單,在這種情況下,我將標記錯誤(服務器端)並重新呈現表單。但是因爲我設置了窗體的目標,所以這個重新渲染也在一個新的標籤中打開,這就是而不是我想要的 - 在這種情況下,我希望它的行爲好像target_top

所以問題是:我可以更改瀏覽器的渲染目標服務器端嗎?

是的,我知道這可以用客戶端JavaScript來完成,但是JS讓我很惱火,而且我必須做驗證服務器端。我可能最終不得不使用它,但請不要將其作爲答案 - 我更加好奇,如果我正在嘗試什麼,甚至可以完成。

PS:我在Ruby on Rails 2.3.8上,以防有人知道框架特定的解決方案。

回答

0

不。這是純粹的客戶端特定功能。事實上,獲得只支持一個窗口的瀏覽器和target屬性根本無效的瀏覽器是完全可能的。甚至有人努力使該屬性完全從未來的HTML標準中消失(例如,XHTML分支沒有這樣的屬性)。

我能想到的HTML和HTTP之間唯一的重疊是<meta http-equiv>標籤(其中HTML會影響HTTP控制的行爲)。 HTTP是一種傳輸協議,旨在處理任何類型的數據。讓它控制呈現將是一個非常可怕的擔憂組合。

幸運的是,我們生活在一個支持JavaScript的世界。使用AJAX請求驗證表單相當容易,特別是對於像jQuery這樣的庫。

例如,該腳本對URL執行POST請求(在這種情況下,/pdf/validate),並期望頁面發回「ok」(如果一切正常)或其他情況下發生錯誤。

<form method="post" action="/pdf/send" id="pdf-form"> 
    <!-- form stuff here --> 
</form> 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
$(document).ready(function() 
{ 
    // set to true if we are to bypass the check 
    // this will happen once we've confirmed the parameters are okay 
    var programmaticSubmit = false; 

    // attach an event handler for when the form is submitted 
    // this allows us to perform our own checks beforehand; we'll do so by 
    // cancelling the event the user triggered, and do the submit ourselves if 
    // we detect no error 
    $('#pdf-form').submit(function(event) 
    { 
     if (!programmaticSubmit) 
     { 
      // first off, cancel the event 
      event.preventDefault(); 

      // do an AJAX request to /pdf/validate 
      $.ajax("/pdf/validate", { 
       type: "POST", 
       data: $(this).serialize(), // send the form data as POST data 
       success: function(result) 
       { 
        // this gets called if the HTTP request did not end 
        // abnormally (i.e. no 4xx or 5xx status); 
        // you may also want to specify an "error" function to 
        // handle such cases 
        if (result == "ok") 
        { 
         // since the server says the data is okay, we trigger 
         // the event again by ourselves, but bypassing the 
         // checks this time 
         programmaticSubmit = true; 
         $(this).submit(); 
        } 
        else // something went wrong! somehow display the error 
         alert(result); 
       } 
      }); 
     } 
    }); 
}); 
</script> 
+0

那就是JavaScript了。我終於找到了一個涉及[Window-Target](http.http-stats.com/Window-Target)HTTP頭的文件,但文檔實際上並不存在,而Firefox忽略了它......我可能會最終使用非常類似於JS的東西 - 謝謝! – 2011-03-31 00:43:43

+0

@Xavier Holt從來沒有聽說過那個!必須是另一個MS特定的未公開擴展。 – zneak 2011-03-31 02:15:39

+0

我還沒有 - 我在看到你提到的那些''標籤時偶然發現了它。還有另外一個信譽良好的來源提到它[這裏](http://vancouver-webpages.com/META/metatags.detail.html),但他們只能說:「指定命名窗口當前頁面;可用於停止出現在包含許多(不是全部)瀏覽器的框架中的頁面。「不知道什麼實際上支持(支持?)它... – 2011-03-31 03:17:50

1

對這個問題的解決方法是使用上的PDF內容處置頭,以迫使該文件進行下載,避免整個「目標」的方法..

Content-type: application/pdf 

Content-Disposition: attachment; filename="downloaded.pdf" 
+0

我希望我能做到,但那些做我的需求清單的人愛上了他的Adobe Acrobat插件(不寒而慄)... Upvote爲理想的答案,但它不適用於我。乾杯! – 2011-03-31 00:09:34

相關問題