Когда я пытаюсь вызвать мои зарегистрированные протоколы один за другим, только один может вызвать случайно

  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>

  1. Пожалуйста, дайте мне знать, как вызвать оба протокола в одном событии.

1 ответ

Эта функция принимает URL-адрес пользовательского протокола в качестве параметра. Затем он создаст временный <iframe> где переданный URL загружается с помощью симулированного клика на скрытом <a> элемент.

    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.

Другие вопросы по тегам