UIWebView и локальный файл css
Я хочу создать веб-страницу, предназначенную для рабочего стола, чтобы она была доступна на UIWebView на iPhone. У меня нет доступа к веб-серверу, с которого происходят страницы. Я хотел бы сделать это, изменяя атрибут href
элемента таблицы стилей <link>
программно.
Я делаю следующее со своим IBOutlet UIWebView *webView
.
NSString *cssPath = [[NSBundle mainBundle] pathForResource:@"MyStyleSheet"
ofType:@"css"];
NSString *js = @"document.getElementsByTagName('link').setAttribute('href','";
NSString *js2 = [js stringByAppendingString:cssPath];
NSString *finalJS = [js2 stringByAppendingString:@"');"];
//check element structure
NSString *res = [webView stringByEvaluatingJavaScriptFromString:finalJS];
Это не работает. Использование сообщения [webView stringByEvaluatingJavaScriptFromString:]
и внесение изменений в тело backgroundColor
тела действительно выполняется - как упражнение, чтобы проверить, правильно ли я использовал вызов.
Я лаяю неправильное дерево?
Ответы
Ответ 1
Вы можете загрузить CSS из локального каталога проекта
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];
подробная информация на этом сайте:
http://iphoneincubator.com/blog/windows-views/uiwebview-revisited
Ответ 2
К сожалению, UIWebView
не предоставляет API для перехвата и изменения запросов, которые он выполняет при загрузке ресурса. Это означает, что любой подход, который вы пытаетесь, будет в какой-то степени взломать.
Первый подход, который я хотел бы попробовать:
- Предоставьте свой собственный делегат
UIWebViewDelegate
в представлении.
- Внесите
-webView:shouldStartLoadWithRequest:navigationType:
и верните NO
, когда вы заметите сделанные запросы CSS.
- Как только представление закончит загрузку основного ресурса, используйте
-stringByEvaluatingJavaScriptFromString:
, чтобы добавить JavaScript на страницу, которая динамически загружает/устанавливает таблицу стилей, которую вы хотите использовать.
В JavaScript я бы создал совершенно новый элемент <link>
/node в документе вместо того, чтобы пытаться изменить существующий.
Ответ 3
Ваш код должен работать, если вы выберете индекс 0 найденных элементов:
NSString *js = @"document.getElementsByTagName('link')[0].setAttribute('href','";
NSString *js2 = [js stringByAppendingString:cssPath];
NSString *finalJS = [js2 stringByAppendingString:@"');"];
[webview stringByEvaluatingJavaScriptFromString:finalJS];
Вы пропустили [0]
Ответ 4
SWIFT 3
Если вы (как и я) используете только фрагмент html (а не полную веб-страницу), вам нужно добавить локальный файл css в заголовок html-фрагмента.
Поэтому я определяю заголовок html следующим образом:
let htmlHeader = "<html> \n <head> \n <link href=\"default.css\" rel=\"stylesheet\" type=\"text/css\" /> \n </head> \n <body> \n"
и нижний колонтитул:
let htmlFooter = "</body> \n </html>"
Затем найдите baseURL для css следующим образом:
let baseURLForCss = Bundle.main.url(forResource: "default", withExtension: "css")
И загрузите фрагмент html с вашим собственным css следующим образом:
webView.loadHTMLString(String.init(format: "%@%@&@", htmlHeader, htmlSnippet, htmlFooter), baseURL: baseURLForCss)