Внедрение CSS в UIWebView с использованием JavaScript - PullRequest
5 голосов
/ 09 января 2012

Я пытаюсь внедрить локальный файл CSS, чтобы переопределить стилизацию веб-страницы.Веб-страница представлена ​​в контейнере UIWebView в iOS.Однако я не могу заставить мой код работать.Смотрите фрагмент моего метода делегата ниже.Этот код выполняется (я вижу сообщение NSLog), но я не вижу результатов его выполнения на странице.

Я знаю, что это не может быть тот код, который я написал, потому что в этом случае я взялстраницы владеют CSS-файлом и просто меняют некоторые цвета.(Для проверки этого метода)

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSString *cssPath = [path stringByAppendingPathComponent:@"reader.css"];
    NSString *js = [NSString stringWithFormat:@"var headID = document.getElementsByTagName('head')[0];var cssNode = document.createElement('link');cssNode.type = 'text/css';cssNode.rel = 'stylesheet';cssNode.href = '%@';cssNode.media = 'screen';headID.appendChild(cssNode);", cssPath];
    [webView stringByEvaluatingJavaScriptFromString:js];
    NSLog(@"webViewDidFinishLoad Executed");
}

1 Ответ

9 голосов
/ 10 января 2012

Ваше решение не будет работать, потому что

  1. ваш cssNode.href должен быть URL-адресом (т. Е. Экранированным и с префиксом file://), а не путем
  2. Safari не делает 't позволяет загружать локальные файлы с удаленной страницы, так как это представляет угрозу безопасности.

В прошлом я делал это, загружая HTML-код с помощью NSURLConnection, а затем добавляя тег <style>в заголовке HTML.Что-то вроде:

NSString *pathToiOSCss = [[NSBundle mainBundle] pathForResource:@"reader" ofType:@"css"];
NSString *iOSCssData = [NSString stringWithContentsOfFile:pathToiOSCss encoding:NSUTF8StringEncoding error:NULL];
NSString *extraHeadTags = [NSString stringWithFormat:@"<style>%@</style></head>", iOSCssData];
html = [uneditedHtml stringByReplacingOccurrencesOfString:@"</head>" withString:extraHeadTags];

[webView loadHTMLString:html baseURL:url];
...