Когда я пытаюсь вызвать мои зарегистрированные протоколы один за другим, только один может вызвать случайно
- Я зарегистрировал два протокола.
- Когда я пытаюсь вызвать оба протокола в одном событии, в браузере 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 ответ
Эта функция принимает 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.