【问题标题】:How do you enable javascript in a WebView如何在 WebView 中启用 javascript
【发布时间】:2009-07-12 03:05:46
【问题描述】:

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

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

【问题讨论】:

    标签: javascript objective-c cocoa webkit


    【解决方案1】:

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

    不过,您需要做的是确保 您指定的 baseURL 是正确的(因为在 html 文件中您指的是带有相对 URL 的 jquery.js仅使用文件名)并且您已jquery.js 文件包含到捆绑资源中

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

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

    【讨论】:

    • 我已经进行了这些更新,这很有意义,但它似乎仍然不起作用。你可以在github.com/pjb3/WebViewApp看到代码
    • 啊,我想通了。我不知道您所说的“将 jquery.js 文件包含到捆绑资源中”是什么意思。我将资源文件夹中的 .js 文件拖到 Targets 中的 WebViewApp 下的“Copy Bundle Resources” um...thing :) 中。现在一切都很好,谢谢!
    • 这是劳拉。我遇到了同样的问题,但按照你的解决方案也没有解决问题。请告诉我如何检查 IB 中是否启用了 javascript。我没有找到任何 javascript 复选框。
    【解决方案2】:

    对于仍在为此苦苦挣扎的人来说只是一个快速更新......我遇到了完全相同的问题,我有一个 html 页面,其中的原型.js 库加载到页面的

    部分。但是当我在 Cocoa 应用程序的 WebView 中打开同一页面时,没有加载该库。实际上,在 WebView 中似乎没有加载任何脚本文件(甚至是我自己的)。

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

    然后我决定查看已编译应用程序的包内容(这将是 XCode 编译您的应用程序的 build/Debug 或 build/Release 目录中的 WebViewApp/Contents/Resources)... 哦哦!他放在 XCode 项目的 Resources 部分的 javascript 文件实际上并没有被复制到构建的应用程序的 Resources 目录中。我查看了我的项目,这是同样的问题。 解决办法?只需将您添加的任何脚本拖到 XCode 中应用程序目标的“复制捆绑资源”部分,瞧,它们就会在那里(而且一切都会正常工作!)。

    我认为您在 Resources 中放置的所有内容都会被自动复制,但我想不是。不幸的是,使用 WebView,除非您做一些工作,否则您没有 Firefox 或 Safari 所具备的所有出色的 Web 调试功能,这些功能可以使这个问题更容易找到。因此,如果有疑问,请检查您实际编译的应用程序在其 Resources 目录下是否具有所需的资源(这可能是程序员版本的“它是否已插入?”?)。这让我很头疼,而我对失去的时间唯一的安慰是,我也许可以从同样的情况下拯救其他一些人。编码愉快!

    【讨论】:

    • 组树中的组,例如“资源”,只不过是组织工具。您可以将资源放在 Classes 组中,将源文件放在 Resources 组中,这对构建时发生的事情没有影响。构建阶段(例如,“复制捆绑资源”)是在构建时发生的。此外,它是带有小写 c 的 Xcode,而不是 XCode。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2023-02-23
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多