Подтвердить что ты не робот

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 тела действительно выполняется - как упражнение, чтобы проверить, правильно ли я использовал вызов.

Я лаяю неправильное дерево?

4b9b3361

Ответ 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)