UIWebView - 在网页上启用右键单击

Posted

技术标签:

【中文标题】UIWebView - 在网页上启用右键单击【英文标题】:UIWebView - Enable Right Click on Webpages 【发布时间】:2014-06-05 08:05:53 【问题描述】:

我的应用程序中有一个 UIWebView,一切运行良好,但某些烦人的网页禁用了用户右键单击以选择文本并显示复制粘贴菜单控制器的能力。我需要在这些网页上为用户重新启用这些操作。我怀疑答案与将 javascript 注入 webViewDidFinishLoading: 上的页面有关,但我不确定如何制作这个 Javascript。有人有什么想法吗?

根据我在网页上检查的内容,我发现它正在禁用 CSS 中的选择。如果该信息有帮助,他们将通过外部样式表文件加载它。

<link rel="stylesheet" media="screen" type="text/css" href="/css/styleSheet.css?hash=174">

其中包含

body 
    -webkit-user-select: none;

我已经尝试注入以下内容,但它不起作用。

NSString* css = @"\"body  -webkit-user-select: default; \"";
NSString* js = [NSString stringWithFormat:
                @"var styleNode = document.createElement('style');\n"
                "styleNode.type = \"text/css\";\n"
                "var styleText = document.createTextNode(%@);\n"
                "styleNode.appendChild(styleText);\n"
                "document.getElementsByTagName('head')[0].appendChild(styleNode);\n",css];
[self.webView stringByEvaluatingJavaScriptFromString:js];

但是,如果我在 UIWebView 上使用桌面 Safari Web Inspector,并将页面的外部 CSS 表更改为 -webkit-user-select:default,它可以工作。我只需要一种能够在我的代码中执行此操作的方法。但是,如果我将此行添加到 html 页面,在加载样式表的下方,它将不起作用。

<link rel="stylesheet" media="screen" type="text/css" href="/css/styleSheet.css?hash=174">
<style type="text/css">body  background: #AAA; -webkit-user-select: default; </style>

这就是我在 Safari Web Inspector 中看到的。由于某种原因,我在样式表之后添加的样式仍然被溢出。

如何将-webkit-user-select: 更改为默认值?我更喜欢使用 Javascript 的答案,而不是将其添加到 htmlString 并重新加载页面。

已解决:

因此,将参数更改为 auto 即可,如下所示。

NSString* css = @"\"body  -webkit-user-select: auto; \"";
NSString* js = [NSString stringWithFormat:
                @"var styleNode = document.createElement('style');\n"
                "styleNode.type = \"text/css\";\n"
                "var styleText = document.createTextNode(%@);\n"
                "styleNode.appendChild(styleText);\n"
                "document.getElementsByTagName('head')[0].appendChild(styleNode);\n",css];
[webView stringByEvaluatingJavaScriptFromString:js];

【问题讨论】:

尝试@"var body = document.getElementsByTagName('body')[0]; body.style["-webkit-user-select"] = 'default';" 感谢您的回复。我尝试通过[webView stringByEvaluatingJavaScriptFromString:@"var body = document.getElementsByTagName('body')[0]; body.style[\"-webkit-user-select\"] = 'default';"] 执行该操作,但没有成功。 我发现应该是这样的 @"document.body.style.webkitUserSelect='default';"但我认为每次重新加载时都必须这样做。 我尝试运行[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='default';"];,但没有成功。我有一种感觉,外部样式表在我的调用之后被加载,因为在 Safari Inspector 中,它看到了 -webkit-user-select=default 的 JS,但它有一个删除线,即使代码被放置在外部样式表行之后。任何想法如何解决这个问题? 首先 "-webkit-user-select: auto | none | text;" 然后你可以尝试 !important 属性到 css 像 "document.body.style.cssText += '-webkit-user-select: auto !important;'"document.body.style.webkitUserSelect='auto !important' 这将覆盖所有的 css 规则,如果他们自己没有重要的话。 【参考方案1】:

First "-webkit-user-select: auto | none | text;" webkitUserSelect 仅采用此值。 那么

Nsstring *OverrideCssRules = @"document.body.style.cssText += '-webkit-user-select: auto !important;'"; OR @"document.body.style.webkitUserSelect='auto !important'";
[self.webView stringByEvaluatingJavaScriptFromString:OverrideCssRules];

【讨论】:

以上是关于UIWebView - 在网页上启用右键单击的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIWebview,禁用双击,允许点击 WKWebview

Cocoa Touch UIWebView - 以编程方式与网页交互

IOS 网络浅析-(十二 UIWebView简介)

从网页控制 UIWebView

我在UIWebView中加载Web视图,我需要单击网站上的登录按钮

iOS:WebKit内核框架的应用与解析