我正在尝试将本地css文件“注入”到下载的xhtml文件中。
我找到了许多如何做的例子,但它对我不起作用......
这是我的代码:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *cssPath = [path stringByAppendingPathComponent:@"test.css"];
NSString *js = [NSString stringWithFormat:@"var cssNode = document.createElement('link');"
"cssNode.type = 'text/css';"
"cssNode.rel = 'stylesheet';"
"cssNode.href = '%@';", cssPath];
js = [NSString stringWithFormat:@"%@document.getElementsByTagName('head')[0].appendChild(cssNode);", js];
//m_webview is a member
[m_webView stringByEvaluatingJavaScriptFromString:js];
}
我在这里做错了什么?
谢谢,
答案 0 :(得分:7)
我也很难做到这一点。
我试图从服务器加载HTML文件,并使用本地CSS文件更改样式。
起初我用过
[webView loadRequest:reqObj];
当它点击- (void)webViewDidFinishLoad:(UIWebView *)webView
时,我试图将CSS文件作为一个孩子推向'头':
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *cssPath = [path stringByAppendingPathComponent:@"style.css"];
NSString *js = [NSString stringWithFormat:@"var cssChild = document.createElement('link');"
"cssChild = 'text/css';"
"cssChild = 'stylesheet';"
"cssChild = '%@';", cssPath];
js = [NSString stringWithFormat:@"%@ document.getElementsByTagName('head')[0].appendChild(cssChild);", js];
[webView stringByEvaluatingJavaScriptFromString:js];
}
所以...它不起作用......
然后我试了NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];
(我将HTML字符串复制到htmlString中)然后,在- (void)webViewDidFinishLoad:(UIWebView *)webView
内部我按照上面的代码注入了CSS。它有效!
但是......我的HTML文件存储在远程服务器上,我没有HTML字符串,所以我用
NSString* myFile = [NSString stringWithFormat:@"http://blablabla.com/file.html"];
NSString* myFileURLString = [myFile stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSData *myFileData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myFileURLString]];
NSString* myFileHtml = [[[NSString alloc] initWithData:myFileData encoding:NSASCIIStringEncoding] autorelease];
获取HTML。现在,我在'myFileHtml'中有原始的HTML文本。 我现在用
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:myFileHtml baseURL:baseURL];
在'webViewDidFinishLoad'中捕获响应,将我的CSS文件注入其中并且它有效:)
也许这个问题有另一个更优雅的解决方案,但这就是我提出来的......
希望它有所帮助。
答案 1 :(得分:2)
cssNode.href ='%@';“,cssPath];
上面一行失败,因为它尝试从网络服务器获取文件。使用类似的东西:
cssNode.href ='file://%@';“,cssPath];
访问本地文件系统。您可以使用Safari的开发人员模式检查iPhone模拟器,看看是否找到并加载了文件。
我最终最终实现了内联样式表,而不是链接到样式表。这是适用于我的代码
NSError *error;
NSString *css = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"stylesheet" ofType:@"css"] encoding:NSASCIIStringEncoding error:&error];
css = [css stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; // js dom inject doesn't accept line breaks, so remove them
NSString *js = [NSString stringWithFormat:@"var styleNode = document.createElement('style');"
"styleNode.type = 'text/css';"
"styleNode.innerHTML = ' %@ ';", css];
js = [NSString stringWithFormat:@"%@document.getElementsByTagName('head')[0].appendChild(styleNode);", js];
[_webView stringByEvaluatingJavaScriptFromString:js];
答案 2 :(得分:1)
我在寻找同一问题的答案时遇到了这个问题。我将HTML页面从Web服务器加载到UIWebView中。 HTML已经有很多CSS,适合网络查看。在我的情况下,我想展示:没有一些不相关的div。
我不想在本地存储HTML然后从文件加载,所以我提出了另一种解决方案,概念上与其他人类似,但更符合我的口味。这是Swift 3.在页面加载后运行,但在显示之前:
let css = "#someDiv {display:none;} #otherDiv {display:none;} .someClass {display:none;}"
let js = "var sheet = document.createElement('style');sheet.innerHTML = \"\(css)\";document.body.appendChild(sheet);"
webView.stringByEvaluatingJavaScript(from: js)
答案 3 :(得分:0)
也许这应该可以解决问题? (未在Xcode中测试):
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *cssPath = [path stringByAppendingPathComponent:@"test.css"];
NSString *js = [NSString stringWithFormat:@"var cssNode = document.createElement('link');"
"cssNode.type = 'text/css';"
"cssNode.rel = 'stylesheet';"
"cssNode.href = '%@';", cssPath];
js = [NSString stringWithFormat:@"%@document.getElementsByTagName('head')[0].appendChild(cssNode);", js];
NSString *k = [NSString stringWithFormat:@"var script = %@; %@", cssPath, js];
//m_webview is a member
[m_webView stringByEvaluatingJavaScriptFromString:k];
}
答案 4 :(得分:0)
迅速5:
在Show WebSite之前,将CSS注入html
import UIKit
import WebKit
class WebViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
config()
}
private func config(){
webView.navigationDelegate = self
guard let url = URL(string: "url") else {
return
}
webView.load(URLRequest(url: url))
}
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
let css = "Css Code"
let js = "var style = document.createElement('style'); style.innerHTML = '\(css)'; document.head.appendChild(style);"
webView.evaluateJavaScript(js, completionHandler: nil)
}
}