【问题标题】:UIWebView loadHTMLString not working in iOS5UIWebView loadHTMLString 在 iOS5 中不起作用
【发布时间】:2011-12-12 00:17:36
【问题描述】:

也许这和这个问题类似,没有回复:loadHTMLString Not Working With iOS5?

我有一个 UIWebView,我使用 loadHTMLString:baseURL: 填充它。 HTML 小而简单,它引用了一个 css 样式表和一个 javascript 脚本,它们是通过 baseURL: 加载的,它被设置为应用程序包内的一个目录。

    // load the html
    NSString* filePath = [NSString stringWithFormat: @"%@/html", [[NSBundle mainBundle] resourcePath ] ];
    [_pCurrentWebView loadHTMLString: html baseURL: [NSURL fileURLWithPath: filePath isDirectory: YES ] ];

这在过去一直有效,但在 iOS5 中被破坏了。在 iOS5 中,UIWebView 中不显示任何内容。 webview 确实提供了所有预期的事件 - 例如。 shouldLoadRequest、didStartLoad、didFinishLoad 等

html 有一个 script 标签,像这样:

<script type="text/javascript" src="./myscript.js" />

如果我删除脚本标记,则页面在 iOS5 中加载并呈现良好。而且我可以看出,css文件的引用方式与脚本.js文件的引用方式相同。

如果我保留脚本标签但将 myscript.js 文件完全清空,它仍然无法加载。

对我来说,这似乎是某种跨站点脚本问题 - 因为 WebView 认为它应该禁止加载脚本(实际上,不允许渲染页面??)

不知道从这里去哪里。想法?

更新

这感觉越来越像跨站点脚本问题。如果我删除它可以工作的标签,尽管没有脚本。我的所有图像都是从 baseURL 加载的,我的样式表也是如此。也就是说,我们知道 baseURL 正在工作。

如果我用脚本文件的实际内容替换标记,那么它就可以工作,所以问题不在于脚本本身。

仍在寻找确认和其他想法来规避。不得不将脚本本身修补到 html 中对我来说很不方便,但这是迄今为止我最好的解决方案。或者,我可以将 html 写入文件系统并通过 loadRequest 加载,但同样,这不是我的首选。

更新 2

感谢@djromero,我有一个解决方案。我的文档是一个 XHTML 文档,因此使用了一个自动关闭的脚本标签(没有内容,只有属性。)但loadHTMLString:baseURL: 显然假定 MIMEType 为text/html,UIWebView 现在显然对其进行了更严格的解释——并且在@987654326 @ 文档,您可能没有自闭合标签。

我的解决方案是切换到loadData:MIMEtype:baseURL: 并将application/xhtml+xml 指定为mime 类型。我可以使用dataUsingEncoding: 从我的 NSString 轻松构造 NSData。

【问题讨论】:

    标签: iphone ios ipad uiwebview ios5


    【解决方案1】:

    加载包含嵌入文件夹引用的 HTML 文件(例如“/file.js”)的方法是将其加载为 URL 而不是 STRING。

    NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"htm"];
    NSURL *url = [NSURL fileURLWithPath:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
    

    我使用它和引用的文件夹(不是引用的文件)在 Xcode 中创建一个普通的网站结构,在嵌入的 index.htm 文件中包含 js/ 和 css/ 和 images/ 引用,例如

    <script type="text/javascript" src="js/jquery-1.6.4.min.js"></script>
    

    更新

    我认为官方不支持在加载的 HTML 字符串中引用 URI。如果必须使用字符串,则在将所需资源文件加载到字符串中之前,再将其加载到 UIWebView 中。

    【讨论】:

    • 是的,这不能回答我的问题。我知道我可以使用 loadRequest:,但我的 html 在任何地方都不作为文件存在 - 它是动态生成的。 loadHTMLString:在 iOS2 - iOS4 中工作,我想了解它为什么坏了以及如何让它再次工作。
    • 我明白了——我什至不知道它应该与 loadHTMLString 一起工作——我在我的第一次嵌入式应用程序尝试中尝试过,但它遇到了你描述的同样的问题。我试图避免回答“它不应该工作”;-)。您也可以在将 js 加载到 webview 之前将其加载到字符串中。
    • 在加载的 HTML 字符串中引用 URI 适用于图像、css 样式表等,也适用于脚本文件。如果有文档说它不受支持,那就这样吧。但我想在放弃之前查看文档。如果不支持,那么为什么要使用 baseURL: 参数?
    • 第二个加 18 个答案描述了您的解决方案:stackoverflow.com/questions/478665/…
    • 是的,我知道这个技巧,并尝试过。它适用于 iOS3 和 iOS4,但不适用于 iOS5。
    【解决方案2】:

    我不是 HTML 标准专家,但是...您是否尝试关闭 &lt;script&gt; 标签:

    <script type="text/javascript" src="./myscript.js"></script>

    它对我有用。

    【讨论】:

    • 哥们,他已经这样关闭了...... />。所以不需要单独关闭它
    • 我会被诅咒的。将脚本关闭标记从 更改为 确实有效!我认为这就是原因:stackoverflow.com/questions/69913/…。 IOS5 必须有一个更兼容/更严格的 HTML 解析器。
    • @mAc:你知道,用 <...> 结束标签并不是普遍有效的。
    • @mAc - 自闭合标签在 XHTML 中有效,但在 HTML 中无效。问题是 loadHTMLString 假定 mime 类型为“text/html”,并且 iOS5 中的严格解析不允许 HTML 的自闭合标签 - 仅适用于 XHTML。我的解决方法是使用 loadData:MIMEType:baseURL: 代替,将“application/xhtml+xml”作为 mime 类型传递。我可以轻松地将我的 html 字符串复制到 NSData。
    • 噢噢噢..!!!现在我知道了。好吧,谢谢“TomSwift”和“madmw”。据我所知,你又增加了一件事...... :)
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2013-08-10
    • 2011-01-28
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多