如何在WebView App中禁用选中文本时的默认复制粘贴菜单
禁用WebView选中文本时的系统默认菜单
针对你遇到的WebView自定义菜单和系统默认菜单同时显示的问题,不同平台有对应的解决方法:
Android平台
- 方法1:重写
onCreateContextMenu
创建自定义WebView类,覆盖onCreateContextMenu方法,不调用父类方法即可阻止系统菜单弹出:
public class CustomWebView extends WebView { public CustomWebView(Context context) { super(context); } @Override protected void onCreateContextMenu(ContextMenu menu) { // 不调用super.onCreateContextMenu(menu),系统默认菜单就不会显示 } }
- 方法2:设置自定义ActionMode回调
如果需要保留部分系统功能但替换菜单,可以设置setActionModeCallback:
webView.setActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // 返回false表示不创建系统默认的ActionMode return false; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } });
iOS平台
- 方法1:禁用用户交互中的选择功能
如果不需要文本选择功能,直接关闭:
webView.allowsSelection = false
- 方法2:自定义
WKUIDelegate的菜单创建方法
如果需要保留文本选择但替换菜单,实现WKUIDelegate的contextMenuConfigurationForElement方法,返回自定义配置:
class ViewController: UIViewController, WKUIDelegate { var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() webView.uiDelegate = self } func webView(_ webView: WKWebView, contextMenuConfigurationForElement elementInfo: WKContextMenuElementInfo, completionHandler: @escaping (UIContextMenuConfiguration?) -> Void) { // 返回nil会阻止系统默认菜单弹出,之后可以显示你的自定义菜单 completionHandler(nil) // 在这里触发你的自定义菜单展示逻辑 } }
通用Web端补充方案
如果你的WebView加载的是自己可控的网页,也可以通过JS来辅助禁用系统菜单:
document.addEventListener('contextmenu', function(e) { e.preventDefault(); });
不过这种方式仅能阻止右键触发的菜单,对移动端长按选中文本唤起的系统菜单效果有限,建议结合原生平台的方法使用。
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

