1

jQuery Mobile在一个运行在UIWebView. 该应用程序是编写的,Monotouch并具有多个选项卡,其中一个选项卡显示 web 视图中的html5内容。jQuery Mobile允许html5内容与应用程序的本机部分具有一致的外观和感觉。我正在尝试构建html5使用jQuery Mobile自定义选择菜单的功能,换句话说,选择data-native-menu属性设置为false,在这里我遇到了一个奇怪的问题。我已将问题提炼为一个简单的示例;这是代码:

<body>
    <div data-role="page" data-theme="b" id="forms">
        <div data-role="content">
             <select id="test" data-native-menu="false">
                 <option value="abc">ABC</option>
                 <option value="def">DEF</option>
                 <option value="ghi">GHI</option>
                 <option value="jkl">JKL</option>
                 <option value="mno">MNO</option>
                 <option value="pqr">PQR</option>
                 <option value="abc1">ABC</option>
                 <option value="def1">DEF</option>
                 <option value="ghi1">GHI</option>
                 <option value="jkl1">JKL</option>
                 <option value="mno1">MNO</option>
                 <option value="pqr1">PQR</option>
                 <option value="abc2">ABC</option>
                 <option value="def2">DEF</option>
                 <option value="ghi2">GHI</option>
                 <option value="jkl2">JKL</option>
                 <option value="mno2">MNO</option>
                 <option value="pqr2">PQR</option>
             </select>
        </div> <!--content-->
    </div> <!-- page-->
</body>

当我在其中运行此代码FirefoxSafari它工作正常时。此外,如果我在其Mobile Safari上运行它iPad也可以正常工作。但是,当我UIWebView在我的应用程序中运行这个时,弹出窗口只显示选择且显示覆盖值少量项目时正确显示并关闭。相反,当显示全屏弹出窗口时,关闭弹出窗口时会出错。因此,例如,使用我上面粘贴的代码,如果iPadportrait mode. 但是如果我打开iPad应用程序landscape mode并单击选择,那么覆盖的项目太多,而是会显示全屏弹出窗口。然后,当我尝试关闭此全屏弹出窗口时,将发生以下两种情况之一:

  • 1)第一次加载页面时,弹出窗口根本不会关闭。它根本不会响应任何触摸事件。

  • 2)如果我在 webview 中重新加载页面内容并重试,现在当我尝试关闭弹出窗口时,整个UIWebView将消失。这种情况将在页面的第二次和每次后续加载时发生。

奇怪的是,当我在调试模式下运行应用程序时,当我尝试从弹出窗口中选择一个项目或单击X关闭它时,我没有看到任何异常抛出。webview 就消失了。我可以说 webview 已经消失了,因为我UITabBarController有一个背景图像显示在每个选项卡上,除了在它所在的选项卡上UIWebView,因为 webview 覆盖了此选项卡上的背景图像。当我尝试关闭弹出窗口时,背景图像突然出现在原本为空的屏幕上......这意味着 webview 现在已经消失了。

我真的需要能够在我的html5内容中使用自定义选择菜单,所以我希望其他人以前遇到过这种情况并且知道这里发生了什么。那么,有谁知道是什么导致了这种奇怪的行为,UIWebView或者知道这个问题的解决方法?

iPad正在运行的iOS版本5.0.1 (9A405)jQuery Mobile我尝试过的版本是alpha 4.11.1.0. 这两个版本的jQuery Mobile. iPad如果需要有关我的或开发设置的其他信息,请告诉我。

更新:

请忽略我上面所说的关于 UIWebView 消失的内容。这实际上并没有发生。事实上,webview 中发生了异常,并且重定向到了嵌入在应用程序包中的错误 html 页面。此错误屏幕具有与 上相同的背景图像UITabBarController,因此我得出了错误的结论。所以,我现在知道 webview 中发生了一些异常,但它仍然非常多!:) 当我知道更多时,我会发布更新。

更新 2:

我现在知道出了什么问题,尽管我还不知道如何解决它。这就是正在发生的事情:单击弹出窗口时,jQuery Mobile正在添加#&ui-state=dialog到 url。在其他浏览器中,此更改会反映在浏览历史记录中,因此通过back对浏览历史记录执行的操作来关闭弹出窗口。在我的 UIWebView 的情况下,对 url 的更改没有反映在历史记录中,因此单击关闭要么什么都不做(历史记录为空),要么返回太远(到一个预加载屏幕,其中只有在实际内容已加载)。

4

1 回答 1

0

我实际上发现这个问题毕竟不是由UIWebview引起的。当我将代码简化为 webview 时我发现它可以正常工作。ASIHTTPRequest发生此问题是因为在我的 webview中我正在使用就是导致 url 的更改未反映在浏览器历史记录中的原因。

在这个阶段我还没有查看哪里 ASIHTTPRequest出了问题,但我认为这超出了这个问题的范围。当我在 ASIHTTPRequest 中处理这个问题时,我将发布关于它的单独问题。

不过,我确实设法解决了这个问题,并且解决方法涉及更改jQuery Mobile源以补偿上一页未存储在历史记录中的事实。在 'jQuery Mobile' 的 1.1.1 版本中,在第41776933行找到以下代码:

window.history.back();

注释掉这些行并将它们替换为以下内容:

$.mobile.changePage( $.mobile.urlHistory.getPrev().url );

现在“jQuery Mobile”实际上将导航到上一个url,而不是回复浏览器历史记录。这比使用浏览器历史记录稍慢,但在我的情况下,当所需的页面没有正确保存到历史记录时,它更可靠。

于 2012-07-31T09:22:47.540 回答