【问题标题】:Why is my custom protocol interfering with ajax calls?为什么我的自定义协议会干扰 ajax 调用?
【发布时间】:2014-01-23 09:20:42
【问题描述】:

我正在编写一个 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;
     });
 });

但现在自定义协议不执行,因此可执行文件永远不会运行。

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

【问题讨论】:

    标签: jquery ajax custom-protocol


    【解决方案1】:

    这个:

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

    字面意思是:用{url} 之一替换当前文档。所以停止所有脚本执行,更改基本 URL 等。

    作为一种解决方案,你可以试试这个:

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

    在新窗口中打开文档。

    但我会稍有不同 - 通过不可见的 iframe 并将其 src 属性分配给按钮单击处理程序中的“myprotocol:abc”。不是那么漂亮,但会起作用。

    【讨论】:

    • 啊,关于“停止所有脚本执行”的部分是我不知道的。谢谢,关于 iframe 的好建议。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2011-11-11
    • 2021-02-06
    • 2011-03-14
    • 2013-01-07
    • 2011-11-26
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多