0

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

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

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

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

{"readyState":0,"responseText":"","status":0,"statusText":"error"}

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

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

<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>

如果我更改 $("#go").click() 以返回 false ,则 ajax 调用成功,如下所示:

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

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

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

4

1 回答 1

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”。不是那么漂亮,但会工作。

于 2014-01-06T02:51:19.087 回答