2014-01-06 56 views
0

我正在編寫一個Web應用程序,其中包含一個使用自定義協議來調用用戶計算機上的可執行文件的鏈接。事情是這樣的:爲什麼我的自定義協議會干擾ajax調用?

<a href="myprotocol:abc">click this</a> 

預期的操作是,用戶點擊鏈接和可執行文件開始運行後,它開始發送進度信息的Web服務。我希望用戶的瀏覽器查詢相同的服務並在Web瀏覽器中向用戶顯示進度。

該計劃是啓動可執行文件,然後開始對服務進行ajax調用並更新網頁上的一些文本。但是,似乎有一些與自定義協議鏈接有關的問題阻止了ajax調用的執行。我收到以下錯誤:

{ 「readyState的」 0 「responseText的」: 「」, 「狀態」:0, 「狀態文本」: 「錯誤」}

這通常是預留給跨域問題但這不是這裏發生的事情。

這裏是我的代碼(我改變了協議是「電子郵件地址」協議,所以它會任何人的機器上工作):

<html> 
    <head> 
     <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script> 
    </head> 
    <body> 
     <a id="go" href="mailto:[email protected]">gopher it</a> 
     <div id="percent"></div> 
    </body> 

    <script> 
     $(document).ready(function() { 
      $("#go").click(function() { 
       pollStatus("abc"); 
      }); 
     }); 

     function pollStatus(id) { 
      $.ajax({ 
      url: "service/" + id + "/status", 
       type: "GET", 
       dataType: "json", 

       success: function(data) { 
        $("#percent").html(data.percent); 

        //keep polling until status is 100% 
        if(data.percent < 100) 
         setTimeout(function() { pollStatus(id) }, 500); 
       }, 

       error: function(e) { 
        console.log(JSON.stringify(e)); 
       } 
      }); 
     } 
    </script> 
</html> 

如果我改變$ Ajax調用成功(「#去」) 。點擊()像這樣返回false:

$(document).ready(function() { 
    $("#go").click(function() { 
     pollStatus("abc"); 
     return false; 
    }); 
}); 

但現在的自定義協議不執行這樣的可執行文件永遠不會運行。

關於如何讓這個工作的任何想法?

回答

2

此:

<a id="go" href="{url}">gopher it</a> 

字面意思是:通過{url}所述一個替換當前文檔。因此,停止所有腳本執行,更改基本URL等

作爲一個解決方案,您可以試試這個:

<a id="go" href="{url}" target="_blank">gopher it</a> 

打開新窗口的文檔。

但我會做一點點不同 - 通過無形的iframe,並將其src屬性分配給您的按鈕點擊處理程序中的「myprotocol:abc」。不是很漂亮,但會起作用。

+0

啊,關於「停止所有腳本執行」的部分是我沒有意識到的。謝謝,關於iframe的好建議。 – d512

相關問題