2009-07-12 3 views
1

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

- (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

ответ

4

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

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

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

NSURL *url = [NSURL fileURLWithPath:[filePath stringByDeletingLastPathComponent]]; 
+0

Я сделал эти обновления, которые имеют смысл, но он все еще не работает. Вы можете увидеть код на http://github.com/pjb3/WebViewApp – pjb3

+0

А, я понял. Я не знал, что вы подразумеваете под «включением файла jquery.js в ресурсы пакета». Я перетащил файлы .js, которые были в папке ресурсов, в «Копировать ресурсы Bundle» um ... thing :) в разделе WebViewApp в Targetets. Все хорошо, спасибо! – pjb3

+0

Это Лора. Я застрял в одной и той же проблеме, но после решения ур также проблема не решена. Скажите, пожалуйста, как мы можем проверить, что javascript включен в IB. Я не устанавливаю флажок javascript. – Aisha

0

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

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

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

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

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

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

+0

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

Смежные вопросы