2011-12-27 91 views
2

我的問題有點類似於this SO問題。但是,由於我的實現有點不同,所以我創建了一個新問題。Google Chrome的Javascript重定向問題

我有一個頁面,後退按鈕將被禁用(經過大量的搜索後得到腳本)。這個頁面做的是重定向到不同的位置(ASP.NET MVC控制器動作)。由於該操作需要時間才能完成,因此會顯示一條等待消息。以下是我用來禁用後退按鈕並重定向頁面的腳本。

<script type="text/javascript"> 
    function changeHashOnLoad() { 
     window.location.href += "#"; 
     setTimeout(changeHashAgain, 50); 
    } 

    function changeHashAgain() { 
     window.location.href += "1"; 
    } 

    var storedHash = window.location.hash; 
    window.setInterval(function() { 
     if (window.location.hash != storedHash) { 
      window.location.hash = storedHash; 
     } 
    }, 50); 

    //do after all images have finished loading 
    $(window).load(function() {  
     changeHashOnLoad();   
     //show the wait message 
     $("#domWaitMessage").show(); 
     //redirect to the new page/controller action 
     window.location.href = document.forms[0].action; 
    }); 
</script> 

我上面的代碼適用於IE和Firefox,但不適用於Chrome。 Opera中的屏幕閃爍很多,但重定向仍然有效。在Chrome中,我的控制器中的操作確實被調用並且處理髮生,但是處理完成後,頁面不會重定向。你們大多數人可能會覺得需要改變流程/實施,但我沒有發言權,所以必須堅持這個流程。

Platform: ASP.NET MVC 2.0
jQuery Version: 1.4.1
Chrome Version: 16.0.912.63m

UPDATE:

下面是小提琴手和鍍鉻網片拍攝的屏幕截圖。

提琴手:
Fiddler Screenshot http://img43.imageshack.us/img43/638/200response.png

鉻:
Chrome Screenshot http://img594.imageshack.us/img594/6381/chromenetwork.png

HTML

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Dummy Title</title> 
</head> 
<body> 
    <form id="form1" method="post" action="Home/BookingConfirmation">  
     <div id="domWaitMessage"> 
      <img src="Content/images/preloader.gif" alt="Please Wait...." /> 
     </div>  
    </form> 
</body> 
</html> 

UPDATE工作腳本

<script type="text/javascript"> 
    function changeHashOnLoad() { 
     window.location.href += "#"; 
     setTimeout(changeHashAgain, 50); 
    } 

    function changeHashAgain() { 
     window.location.href += "1"; 
    } 

    var storedHash = window.location.hash; 
    window.setInterval(function() { 
     if (window.location.hash != storedHash) { 
      window.location.hash = storedHash; 
     } 
    }, 50); 

    //do after all images have finished loading 
    $(window).load(function() {  
     changeHashOnLoad();   
     //show the wait message 
     $("#domWaitMessage").show(); 
     //ORIGINAL REDIRECTION CODE 
     //window.location.href = document.forms[0].action; 
     //NEW WORKING REDIRECTION CODE 
     setTimeout(function() { window.location.href = document.forms[0].action; }, 100); 
    }); 
</script> 
+2

我懷疑這是*原因*,但僅供參考,您的'setTimeout'很奇怪,因爲您在超時時間內使用了一個字符串。另外,你不需要函數調用的字符串。你可以用下面的代碼替換那行:'setTimeout(changeHashAgain,50);' – Jacob 2011-12-27 18:17:44

+0

@Jacob,嘗試過但仍然不起作用。但你的建議看起來更清潔,謝謝! – 2011-12-28 04:45:02

回答

5

事實上,這是發生了什麼:

  1. 功能changeHashOnLoad(),以存儲在歷史第二散列(即 '#1')設置超時。但現在不執行該功能(它會在50毫秒)

  2. 的主要代碼繼續運行至行做重定向到document.forms [0] .action

  3. 現在只有:在timeouted函數changeHashAgain()被執行。該頁面被重定向到'#1'並且重定向到document.forms [0]。操作被取消

一個簡單而快速的解決方法:延遲主要重定向。

setTimeout(function() { window.location.href = document.forms[0].action; },100); 

所以你可以說「爲什麼選擇Chrome?」 ? Chrome和他的javascript engine V8只比其他瀏覽器快得多。在50ms內,Chrome仍然開始重定向,而FF和IE沒有!

+0

Wooohooooo,它工作!非常感謝@Artimuz。 – 2012-01-02 09:56:00

0

而不是使用getAttribute("action")的嘗試是這樣的:

window.location.href = document.forms[0].action; 
+0

對不起,仍然無法正常工作。 – 2011-12-28 04:47:54

+0

它適合我。你能否提供一個完整的頁面作爲例子,即具有action-attribute的表單? – 2011-12-31 12:37:56

0

這鉻爲我工作。由於您沒有提供完整的代碼,因此很難分辨出錯誤的位置,但似乎沒有出現在上面的代碼中。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title></title> 
     <link rel="stylesheet" type="text/css" href="class.css" /> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    function changeHashOnLoad() { 
     window.location.href += "#"; 
     setTimeout(changeHashAgain, 50); 
    } 

    function changeHashAgain() { 
     window.location.href += "1"; 
    } 

    var storedHash = window.location.hash; 
    window.setInterval(function() { 
     if (window.location.hash != storedHash) { 
      window.location.hash = storedHash; 
     } 
    }, 50); 

    //do after all images have finished loading 
    $(window).load(function() {  
     changeHashOnLoad(); 

     //show the wait message 
     $("#domWaitMessage").show(); 
     //redirect to the new page/controller action 
     window.location.href = document.forms[0].action; 
    }); 
</script> 
    </head> 
    <body> 
    <form method="post" action="gotothispage.page"> 
    <div style="display: none" id="domWaitMessage">HELLO</div> 
    </form> 
    </body> 
</html> 
+0

我已經添加了HTML部分。 – 2012-01-02 09:15:04