我想禁用在 iOS Safari(网络浏览器)中选择特定文本后出现的默认上下文菜单。那可能吗?
问问题
9143 次
4 回答
2
我发现的唯一方法是删除选择并使用 javascript 再次选择。看看我的代码:
/* prevent ios edit-menu */
if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) {
!function(){
var target = document.body; // the element where the edit menue should be disabled
var preventSelRecursion;
document.addEventListener('selectionchange', function(e){
var S = getSelection();
if (!S.rangeCount) return;
if (S.isCollapsed) return;
var r = S.getRangeAt(0);
if (!target.contains(r.commonAncestorContainer)) return;
if (preventSelRecursion) return;
iosSelMenuPrevent();
}, false);
var iosSelMenuPrevent = debounce(function(){
var S = getSelection();
var r = S.getRangeAt(0);
preventSelRecursion = true;
S = getSelection();
S.removeAllRanges();
setTimeout(function(){ // make remove-add-selection removes the menu
S.addRange(r);
setTimeout(function(){
preventSelRecursion = false;
});
},4);
},800); // if no selectionchange during 800ms : remove the menu
/* helper-function */
function debounce(fn, delay) {
var timer = null;
return function () {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
};
}
}();
}
于 2015-05-05T07:42:10.827 回答
0
根据移动Safari上的onclick块复制+粘贴?,如果文本位于具有 onclick 事件的元素中,则不会显示上下文菜单。
于 2013-07-25T21:54:09.940 回答
0
受 Hans Gustavson 的回答启发,我在 TypeScript 中提出了一个更简单的解决方案:
function disableIosSafariCallout(this: Window, event: any) {
const s = this.getSelection();
if ((s?.rangeCount || 0) > 0) {
const r = s?.getRangeAt(0);
s?.removeAllRanges();
setTimeout(() => {
s?.addRange(r!);
}, 50);
}
}
document.ontouchend = disableIosSafariCallout.bind(window);
此解决方案实际上是一种解决方法。当您选择文本时,您可能仍会看到文本选择标注显示,然后立即消失。我不确定汉斯·古斯塔夫森的回答是否有同样的缺陷......
于 2020-12-08T12:43:43.093 回答