首页 > 解决方案 > 如何在 WKWebView 中禁用复制和粘贴(标注/弹出)?

问题描述

我想禁用标注菜单,如果您在 web 视图中长按一个元素,它会弹出:

剪切、复制、粘贴、查找、分享

有很多像这样的答案,但它们似乎都不起作用。不知道这些东西UIWebView是否也适用于WKWebView...

我试图通过 JavaScript 操作 CSS。这似乎仅在您将脚本添加到WKUserContentController而不是在didFinish().

不起作用的事情:

window.getSelection().removeAllRanges();
document.body.style.webkitTouchCallout='none';
document.body.style.webkitUserSelect='none';

部分有效的事情:

var style = document.createElement('style');
style.innerHTML = '* { -webkit-touch-callout: none; -webkit-user-select: none; }';
document.getElementsByTagName('head')[0].appendChild(style);

或以 CSS 形式

*:not(input):not(textarea) {
    -webkit-user-select: none;    /* disable selection/copy of UIWebView */
    -webkit-touch-callout: none;  /* disable the iOS popup when long-press on a link */
}

只有类似**:not(input):not(textarea)似乎有效的东西(没有body或其他特定标签)。这样做的问题是,通过这个禁用了这么多元素......我只需要在某些特定元素上使用它!

我也尝试使用canPerformAction()

private static readonly Selector copyAction = new Selector("copy:");
private static readonly Selector pasteAction = new Selector("paste:");
private static readonly Selector cutAction = new Selector("cut:");

public override bool CanPerform(Selector action, NSObject withSender)
{
    if (action == copyAction || action == pasteAction || action == cutAction)
    {
        System.Diagnostics.Debug.WriteLine(action.Name);
    }

    return false;
}

这里似乎链中的另一个响应者正在返回 true 并覆盖我的设置。弹出/标注菜单仍然出现。我只是尽量减少可用选项(如上面的屏幕所示)。

我唯一可以尝试的是使用手势识别器来禁用这种点击,但目前我不知道如何。

我该怎么做才能禁用弹出/标注菜单?

标签: javascriptcssiosxamarin.ioswkwebview

解决方案


我尝试覆盖在 UIWebView 中运行良好的方法 canPerformAction,但在 WKWebView 上不起作用。

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(UIResponderStandardEditActions.cut(_:)) ||
        action == #selector(UIResponderStandardEditActions.copy(_:)) ||
        action == #selector(UIResponderStandardEditActions.selectAll(_:)) ||
        action == #selector(UIResponderStandardEditActions.select(_:)) {
        return false
    }
    return super.canPerformAction(action, withSender: sender)
}

推荐阅读