当我尝试依次调用我的注册协议时,只有一个可以随机调用。

7
  1. 我注册了两个协议。
  2. 当我在同一个事件中尝试调用这两个协议时,在Chrome浏览器中只有一个会被调用。

$(function () {
    $("div[href]").click(function (event) {
        debugger;
        //for validation purpose.
        window.location = "abcd:";

       //if it is validated then
        window.location ="xyz:";



    });
});
<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>Custom Protocol Detection</title>
</head>

<body id="abcd">
    <h1>Click one of these labels:</h1>
    <a href="#" id="atemp"></a>
    <div href="blahblah:randomstuff"  style="background-color:aquamarine">
        Non-exist protocol
    </div>
    <div href="mailto:johndoe@somewhere.com" style="background-color:aqua">
        Send email
    </div>
    <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>   
    <script src="example.js"></script>
</body>

</html>

请告诉我如何在同一事件中调用两个协议。

可能会有遗漏,但由于窗口在任何给定时间只能处于一个位置,因此只能将一个“协议”(如您所称)分配给window.location。但是,您可以同时执行多个ajax调用。 - Geert-Jan
你是在说 window.open() 吗?(或者像Geert所说的多个ajax调用)window.location 是当前窗口的地址,赋值两次是没有意义的。 - MT-FreeHK
@Geert-Jan 首先创建两个不同的协议。如果将其分配给Window.Location来调用这些协议,那么它就会被调用。我做了同样的事情,首先将第一个协议传递给验证,然后将第二个协议传递给调用应用程序。 - rishabh gupta
这有点像问为什么你不能成功地一次性上两辆公共汽车... - CBroe
1
@HyyanAboFakher 如果有人遇到这个问题,这完全是有道理的。如果您有任何建议,请帮忙提供。 - prem
显示剩余9条评论
1个回答

0
该函数以自定义协议URL作为参数。然后它将创建一个临时的<iframe>,通过模拟点击隐藏的<a>元素来加载传递的URL。
    function invokeProtoLink(url) {
      return new Promise(function(resolve, reject) {
        // create temp frame where url will be opened
        const frame = document.createElement('iframe');
        frame.name = '_invoker_' + Math.random();

        // create temp link and set it's target to temp frame
        const lnk = document.createElement('a');
        lnk.href = url;
        lnk.target = frame.name;

        // frame must be appended to body otherwise link will
        // open in new tab, and might trigger popup blocker
        document.body.appendChild(frame);

        setTimeout(function() {
          // remove temp frame
          frame.parentNode.removeChild(frame);
          resolve();
        }, 0);

        // a simple lnk.click() did not work in firefox
        // hence we're using dispatchEvent
        lnk.dispatchEvent(new MouseEvent('click'))
      });
    }

根据您的示例,使用方法应该是:(这必须在事件处理程序中,例如onclick

    invokeProtoLink('abcd://').then(() => {
      invokeProtoLink('xyz://');
    });

已在Chrome 68、Edge 42和Firefox 61上进行测试。


模拟点击模拟的自定义协议 - 太棒了!+1 给 counterpoise。 - wordragon
@lostsource,你的代码只有在调试模式下才能正常工作。一旦我关闭检查元素,它就不起作用了。 - rishabh gupta
@rishabhgupta 这在所有的浏览器上都发生吗?你尝试过移除 debugger; 语句吗? - lostsource
@lostsource 我的意思是说,当我使用F10进行检查并查看代码时,它可以正常工作。但如果我不使用检查功能,则无法正常工作。我使用的是Chrome 68.0.3440.106版本(官方版本)(64位)。 - rishabh gupta
@rishabhgupta 请给我展示一下你调用 invokeProtoLink 方法的代码。 - lostsource
@lostsource 抱歉让您久等了。请前往链接http://plnkr.co/edit/aF4g2vgL72dlDSJiN2cI?p=preview查看我的实现。 - rishabh gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接