如何在WebView中启用javascript

时间:2009-07-12 03:05:47

标签: javascript objective-c cocoa webkit

我有一个非常简单的Mac Cocoa应用程序,它只有一个Web视图,可以加载带有一些CSS和JavaScript的HTML文件。我已经将app委托连接到这个方法:

- (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代码无法执行。如果我在Safari中打开index.html,Hello World h1将按预期消失。为什么不在我的WebView中的应用程序中发生这种情况?我必须做些什么才能启用JavaScript吗?在Interface Builder中检查JavaScript旁边的框。

此代码可在http://github.com/pjb3/WebViewApp

处获得

3 个答案:

答案 0 :(得分:4)

您无需执行任何操作即可启用JavaScript;它默认在WebView中启用。就像你说的那样,你总是可以在Interface Builder中检查是否选中了JavaScript复选框。

但是,您需要做的是确保您指定的baseURL是正确的(因为在html文件中您指的是jquery.js使用仅使用文件名的相对网址,并且jquery.js文件包含在捆绑资源中

您发布的代码将为nil变量生成url值:+URLWithString:期望有效的URL字符串(符合RFC 2396)作为参数(文件系统)你提供的路径不是)。你想要的是+fileURLWithPath:,你还需要使用index.htmljquery.js所在目录的文件系统路径,你可以通过从你的路径中删除文件名来获得得到了(使用NSString的{​​{1}})。以下是您获得正确的-stringByDeletingLastPathComponent:

的方法
baseURL

答案 1 :(得分:2)

对于仍在努力解决这个问题的人来说,只是一个快速更新......我遇到了一个完全相同的问题,我在html页面上加载了原型.js库,并在&lt; head&gt;&lt; / head&gt;中加载了页面的一部分。但是当我在Cocoa应用程序中的WebView中打开同一页面时,没有加载库。实际上,没有加载的脚本文件(甚至我自己的)似乎在WebView中工作。

我从链接pjb3下载了上面的github代码,希望他可能找到了修复程序并更新了它。没有这样的运气。它仍然有同样的问题。

然后我决定查看已编译应用程序的包内容(这样就可以是构建/调试的WebViewApp / Contents / Resources或者XCode编译你的app的build / Release目录)... 啊哈!他放在XCode项目的Resources部分中的javascript文件实际上并没有被复制到构建应用程序的Resources目录。我查看了我的项目,这也是同样的问题。 修复?只需将您添加的任何脚本拖到XCode中的应用程序目标的“复制包资源”部分,瞧,他们就会在那里(事情确实会有效!)。

我认为你在资源中所做的一切都是自动复制的,但我想不是。不幸的是,使用WebView,除非你做了一些工作,否则你没有Firefox或Safari所能提供的所有优秀的Web调试功能,这会让这个问题更容易找到。因此,如果有疑问,请检查您的实际编译应用程序是否具有其资源目录下所需的资源(这可能是程序员的版本“它是否插入?”?)。这让我头疼不已,我唯一的安慰是因为我可以挽救其他一些人。快乐的编码!

答案 2 :(得分:0)

除了hasseg所说的:为什么不使用它来加载文件呢?

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