Как включить Javascript в WebView

1

У меня очень простое приложение для Mac Cocoa, у которого есть только веб-представление, которое загружает HTML файл с помощью CSS и JavaScript. Я подключил делегат приложения к этому методу:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
  NSString* filePath = [[NSBundle mainBundle] pathForResource: @"index" ofType: @"html"];
  NSURL *url = [NSURL URLWithString: filePath];
  [[self.webView mainFrame] loadHTMLString: [NSString stringWithContentsOfFile: filePath] baseURL: url];
}

Файл index.html содержит следующее:

<html>
  <head>
    <title>Hello, World!</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
      jQuery(function($){
        $('h1').fadeOut()
      })
    </script>
  </head>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>

Файл style.css загружается правильно, потому что я задал для него серый цвет, поэтому я знаю, что он может загружать другие ресурсы из пакета ресурсов. Код javascript не выполняется. Если я открою index.html в Safari, Hello World h1 исчезнет, ​​как и ожидалось. Почему это не происходит в приложении в моем WebView? Должен ли я что-то сделать для включения JavaScript? В интерфейсе Builder установлен флажок рядом с JavaScript.

Код для этого доступен в http://github.com/pjb3/WebViewApp

Теги:
cocoa
webkit

3 ответа

4
Лучший ответ

Вам не нужно ничего делать, чтобы включить JavaScript; он включен в WebView по умолчанию. И, как вы сказали, вы всегда можете проверить в Interface Builder, что флажок JavaScript выбран.

Однако вам нужно убедиться, что baseURL, который вы указываете, является правильным (поскольку в html файле вы ссылаетесь на jquery.js с относительным URL-адресом используя только имя файла) и что вы включили файл jquery.js в ресурсы пакета.

Выведенный код приведет к значению nil для переменной url: +URLWithString: ожидает действительную строку URL (которая соответствует RFC 2396) в качестве аргумента (который путь файловой системы, который вы предоставляете, не). Вы хотите +fileURLWithPath:, и вам также необходимо использовать путь к файловой системе в каталоге, где находятся index.html и jquery.js, которые вы можете получить, удалив имя файла из вашего пути (используя NSString -stringByDeletingLastPathComponent:). Вот как вы получите правильный baseURL:

NSURL *url = [NSURL fileURLWithPath:[filePath stringByDeletingLastPathComponent]];
  • 0
    Я сделал эти обновления, которые имеют смысл, но это все еще не работает. Вы можете увидеть код на github.com/pjb3/WebViewApp
  • 0
    Ах, я понял это. Я не знал, что вы подразумевали под «включением файла jquery.js в ресурсы пакета». Я перетащил файлы .js, которые находились в папке ресурсов, в «Копировать набор ресурсов», гм… вещь :), в WebViewApp в Targets. Все хорошо сейчас, спасибо!
Показать ещё 1 комментарий
2

Просто быстрое обновление для тех, кто все еще борется с этим... У меня была такая же проблема, когда у меня была html-страница с библиотекой prototype.js, загружаемой в <head> </head> раздел страницы. Но библиотека не загружалась, когда я открывал одну и ту же страницу в WebView в приложении Cocoa. Фактически, файлы script, загружаемые (даже мои собственные), как представляется, работали в WebView.

Я загрузил вышеуказанный код github, который был предоставлен из ссылки pjb3, надеясь, что, возможно, он нашел исправление и обновил его. Нет такой удачи. У него все еще были те же проблемы.

И затем я решил посмотреть содержимое пакета скомпилированного приложения (так что это будет WebViewApp/Содержание/Ресурсы из каталога build/Debug или build/Release, где XCode скомпилировал ваше приложение)... Ого! Файлы javascript, которые он ввел в разделе "Ресурсы" проекта XCode, на самом деле не были скопированы в созданный каталог ресурсов приложения. Я смотрел в своем проекте, и это была та же проблема. Исправить? Просто перетащите любой из скриптов, которые вы добавили в раздел "Ресурсы копирования Bundle" вашего приложения в XCode и voila, они будут там (и все будет работать!).

Я думал, что все, что вы помещаете в "Ресурсы", автоматически копируется, но, я думаю, это не так. И, к сожалению, с помощью WebView, если вы не выполняете немного работы, у вас нет всех отличных отладочных материалов для веб-сайтов, которые могли бы сделать Firefox или Safari, что облегчило бы эту проблему. Поэтому, если вы сомневаетесь, проверьте, действительно ли ваше фактическое скомпилированное приложение обладает ресурсами, которые ему нужны, в его каталоге ресурсов (может быть, это версия программиста "Включена ли она?"?). Это заняло у меня много царапин на голове, и мое единственное утешение за утраченные часы - это то, что я могу спасти других людей от них. Счастливое кодирование!

  • 0
    Группы в дереве групп, такие как «Ресурсы», являются не более чем организационными инструментами. Вы можете поместить ресурсы в группу «Классы» и исходные файлы в группу «Ресурсы», и не имеет значения, что происходит во время сборки. Фазы сборки (например, «Копирование комплекта ресурсов») - это то, что происходит во время сборки. Кроме того, это Xcode с строчной буквой c, а не XCode.
0

В дополнение к тому, что hasseg сказал: Почему бы не использовать это, чтобы загрузить файл вместо этого?

NSURL *url = [NSURL fileURLWithPath:filePath];
[self.webView setMainFrameURL:url];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню