Я работаю над проектом, который использует WebView для отображения большей части своего контента. Содержимое загружается из файлов HTML на диск, который я не писал, и не могу контролировать его. Я хочу иметь возможность применять собственный стиль CSS для каждой страницы, которая загружается в представление. Для этого я реализовал следующий фрагмент в -(void)webView:didFinishLoadForFrame:
DOMDocument *doc = [frame DOMDocument];
DOMElement *link = [doc createElement:@"link"];
[link setAttribute:@"rel" value:@"stylesheet"];
[link setAttribute:@"type" value:@"text/css"];
[link setAttribute:@"href" value:[cssPath path]];
DOMNodeList *heads = [doc getElementsByName:@"head"];
[[heads item:0] appendChild:link];
Я пробовал ту же последовательность операторов в файле JavaScript (в JavaScript, конечно, не в Objective-C), и это сработало. Приведенный выше код, однако, не работает. Я прошел через это с помощью отладчика XCode, и похоже, что все работает (переменные правильно инициализированы с действительными данными и т. Д.), Но я не вижу изменений во фрейме. Что я делаю неправильно? Есть ли лучший способ добиться того, чего я пытаюсь достичь? Есть ли причина, по которой он будет работать в JavaScript, но не в Objective-C?
Редактировать: Я играл с этим последние пару дней. Я до сих пор не смог использовать объекты DOM *, но получил некоторые результаты, выполнив это:
NSString *js = @"var link = document.createElement('link');";
js = [js stringByAppendingString:@"link.setAttribute('rel', 'stylesheet');"];
js = [js stringByAppendingString:@"link.setAttribute('type', 'text/css');"];
js = [js stringByAppendingFormat:@"link.setAttribute('href', '%@');",
[defaultCSSURL path]];
js = [js stringByAppendingString:
@"document.getElementsByTagName('head')[0].appendChild(link);"];
[[view windowScriptObject] evaluateWebScript:js];
Я не особенно доволен этим решением, но это единственный способ, которым я смог заставить его работать. Обратите внимание, что defaultCSSURL
- это статический NSURL, указывающий на файл CSS в проекте.