为什么我的自定义协议会干扰ajax调用?

时间:2014-01-06 02:36:05

标签: jquery ajax custom-protocol

我正在编写一个Web应用程序,其中包含一个使用自定义协议调用用户计算机上的可执行文件的链接。像这样:

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

预期的操作是在用户单击链接并且可执行文件开始运行后,它开始将进度信息发送到Web服务。我希望用户的浏览器查询相同的服务,并在Web浏览器中向用户显示进度。

计划是启动可执行文件然后开始对服务进行ajax调用并更新网页上的一些文本。但是,似乎存在与自定义协议链接相关的一些问题,导致无法执行ajax调用。我收到以下错误:

{&#34; readyState的&#34;:0,&#34; responseText的&#34;:&#34;&#34;&#34;状态&#34;:0,&#34;状态文本&# 34;:&#34;错误&#34;}

这通常是针对跨域问题保留的,但不是这里发生的事情。

这是我的代码(我将协议更改为&#34; mailto&#34;协议,因此它可以在任何机器上运行):

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    </head>
    <body>
        <a id="go" href="mailto:abc@def.com">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>

如果我更改$(&#34;#go&#34;),则ajax调用成功。click()返回false,如下所示:

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

但是现在自定义协议没有执行,所以永远不会运行可执行文件。

关于如何让它发挥作用的任何想法?

1 个答案:

答案 0 :(得分: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”。不是那么漂亮但会起作用。