如何处理未在 Safari 上安装的自定义协议仍会触发 onblur 事件?
How do I handle a custom protocol not being installed on Safari still triggering the onblur event?
我有一个自定义协议检查程序,用于检查是否安装了协议。
对于 Safari(与 chrome 相同)它关注一个元素,触发协议并监听 onblur。
但是在 Safari 中,如果未安装该协议,浏览器会抛出一个警告 esc 弹出窗口说:"Safari cannot open the page because the address is invalid." 这反过来会触发 onblur 事件。
有没有人找到更好的管理方法?如果需要,它可以是 Safari 特定的解决方案。
//Chrome (and default for other browsers)
function checkChrome(){
bodyElement.append("<input type='text' id='focusInput' style='background: transparent;border: none;height: 0px;width: 0px;' />");
var focusBodyElement = $('#focusInput')[0], temporaryResult = false;
focusBodyElement.focus();
focusBodyElement.onblur = function () {
updateResult(true);
return;
};
//will trigger onblur
location.href = protocolStr;
//Note: timeout could vary as per the browser version, have a higher value
setTimeout(function () {
focusBodyElement.onblur = null;
if (protocolSupport[protocolStr]===null) {
updateResult(false)
}
}, 1000);
}
我过去在这里使用过 custom-protocol-detection,尽管我的目标是所有浏览器。
话虽这么说 - 在挖掘他们的来源时,他们的策略似乎是将内容嵌入到 javascript 创建的隐藏框架中。
function openUriWithHiddenFrame(uri, failCb, successCb) {
var timeout = setTimeout(function () {
failCb();
handler.remove();
}, 1000);
var iframe = document.querySelector("#hiddenIframe");
if (!iframe) {
iframe = _createHiddenIframe(document.body, "about:blank");
}
var handler = _registerEvent(window, "blur", onBlur);
function onBlur() {
clearTimeout(timeout);
handler.remove();
successCb();
}
iframe.contentWindow.location.href = uri;
}
来源还包含适用于所有浏览器的策略。
我有一个自定义协议检查程序,用于检查是否安装了协议。
对于 Safari(与 chrome 相同)它关注一个元素,触发协议并监听 onblur。
但是在 Safari 中,如果未安装该协议,浏览器会抛出一个警告 esc 弹出窗口说:"Safari cannot open the page because the address is invalid." 这反过来会触发 onblur 事件。
有没有人找到更好的管理方法?如果需要,它可以是 Safari 特定的解决方案。
//Chrome (and default for other browsers)
function checkChrome(){
bodyElement.append("<input type='text' id='focusInput' style='background: transparent;border: none;height: 0px;width: 0px;' />");
var focusBodyElement = $('#focusInput')[0], temporaryResult = false;
focusBodyElement.focus();
focusBodyElement.onblur = function () {
updateResult(true);
return;
};
//will trigger onblur
location.href = protocolStr;
//Note: timeout could vary as per the browser version, have a higher value
setTimeout(function () {
focusBodyElement.onblur = null;
if (protocolSupport[protocolStr]===null) {
updateResult(false)
}
}, 1000);
}
我过去在这里使用过 custom-protocol-detection,尽管我的目标是所有浏览器。
话虽这么说 - 在挖掘他们的来源时,他们的策略似乎是将内容嵌入到 javascript 创建的隐藏框架中。
function openUriWithHiddenFrame(uri, failCb, successCb) {
var timeout = setTimeout(function () {
failCb();
handler.remove();
}, 1000);
var iframe = document.querySelector("#hiddenIframe");
if (!iframe) {
iframe = _createHiddenIframe(document.body, "about:blank");
}
var handler = _registerEvent(window, "blur", onBlur);
function onBlur() {
clearTimeout(timeout);
handler.remove();
successCb();
}
iframe.contentWindow.location.href = uri;
}
来源还包含适用于所有浏览器的策略。