Добавление новых элементов в DOM WebFrame из Cocoa / Objective-C - PullRequest
3 голосов
/ 09 декабря 2010

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

1 Ответ

2 голосов
/ 10 декабря 2010

Я не уверен, почему этот конкретный пример не работает, но я выполнил это с помощью объекта сценария для выполнения javascript на странице (и jquery, потому что это очень удобно):Объект сценария может быть получен путем установки объекта в качестве делегата веб-просмотра (webView:windowScriptObjectAvailable)

Но это только один из подходов.Я знаю, что имел массу проблем с самим объектом DOMDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...