将本地css注入UIWebView

时间:2011-12-19 14:50:55

标签: iphone ios uiwebview

我正在尝试将本地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];
}

我在这里做错了什么?

谢谢,

5 个答案:

答案 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)
    }


}