【问题标题】:Disable Cut/Copy in Webview在 Webview 中禁用剪切/复制
【发布时间】:2015-01-08 03:42:46
【问题描述】:

好的,场景很简单:

  • 我有一个 WebView
  • 我希望用户能够从该 web 视图中剪切/复制任何内容,无论如何(使用 ⌘C 或通过编辑菜单)

我知道我必须继承 WebView,但我必须重写哪些特定方法?

有什么想法吗? (欢迎任何其他方法!)

【问题讨论】:

    标签: objective-c macos cocoa webview


    【解决方案1】:

    将以下 CSS 添加到某个文件中

    html {
        -ms-touch-action: manipulation;
        touch-action: manipulation;
    }
    
    body {
        -webkit-user-select: none !important;
        -webkit-tap-highlight-color: rgba(0,0,0,0) !important;
        -webkit-touch-callout: none !important;
    }  
    

    并将该 CSS 链接到您的 HTML

    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <link rel="stylesheet" href="LayoutTemplates/css/style.css" type="text/css" />
        </head>
    </html>  
    

    或者以编程方式禁用它

    - (void)webViewDidFinishLoad:(UIWebView *)webView 
    {
        [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
        [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
    }
    

    【讨论】:

    • 嗯...我见过类似的答案,比如 100 次,但它绝对没有任何效果。我可以完美地进入 Webview,选择一些文本并 Cmd + 复制它,或者使用编辑菜单...(我真的不知道发生了什么,或者为什么所谓的对其他人有用的东西对我不起作用!)
    • 这很奇怪,第一个解决方案现在在我的项目上工作,如果没有选择,你不能复制它。您是如何尝试复制它的?
    • Cmd+C 和 Edit > Copy 都可以。问题是(可能是因为我的情况有些转折),我想阻止/拦截 copy:cut: 操作。
    • stackoverflow.com/questions/5995210/… "禁用复制/粘贴用户菜单:" 也不起作用?
    • 不,它没有。 canPerformAction: 永远不会被调用(我相信有人提到它的目的是仅检查 JS 触发的操作...:S)
    【解决方案2】:

    好的,这就是解决方案。

    首先,设置 Webview 的 Editing Delegate:

    [_myWebview setEditingDelegate:self];
    

    然后实现我们需要的一个函数来拦截复制/剪切动作(或任何与此相关的动作,但这就是我们要做的):

    - (BOOL)webView:(WebView *)webView doCommandBySelector:(SEL)command
    {
        NSString* commandStr = NSStringFromSelector(command);
    
        if ( ([commandStr isEqualToString:@"copy:"]) || 
             ([commandStr isEqualToString:@"cut:"]))
        {
            NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
            [pasteboard clearContents];
            return YES; // YES as in "Yes, I've handled the command, 
                        // = don't do anything else" :-)
        }
        else return NO;
    }
    

    希望您不会像我在寻找有效答案时那样浪费太多时间... :-)

    【讨论】:

    • @l0gg3r 谢谢,我已经把头撞在墙上好几个小时了...... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多