jquery mobile alpha4有什么变化

Jquery mobile团队即将发布alpha4,这个版本主要关注两个问题:性能以及兼容性。以下是这个版本更新的主要部分

Windows Phone 7 (WP7) 支持

JQM已经支持在WP7上运行,原来对WP7原生浏览器的支持度为C,也就是说部分核心功能不可用。而alpha4对这个做了大幅改动,支持度为A-,也就是说jquery mobile所有核心功能在WP7上都能运行良好。顺带受惠的还有桌面版的ie7, 8, 9,也能取得很好的运行效果。

名称空间data- 属性

jquery mobile大量使用html5的data属性来定义html标签,比如页头是 data-role=”header”,但是其它开发框架和插件也可能使用了data来标记某些特性,为避免冲突,alpha4新增了名称空间的概念,新增了jqmData,jqmRemoveData和jqmHasData这几个方法来访问data属性,和jquery的data()相比,这几个方法支持名称空间访问。

举个例子,原来使用data-icon来标记一个标签使用的图标,但是如果你使用了名称空间 foo,那么这个属性应该变成 data-foo-icon。为了不影响原来基于jquery mobile开发的程序,名称空间默认为空,保持不变。

统一的touch/mouse事件处理系统

新的touch/mouse“虚拟”事件,详情请参考The current state of touch events

phonegap支持增强

jquery mobile很适合和phonegap一起搭配来做原生的手机应用,但是在alpha3的时候,页面上的链接会被phonegap神奇的截断,有三个相关的问题:

  • jQuery 1.5 截断了 file:// URLs
  • jQuery 1.5.1 修复了 file://,但是它把HTML当成是XML, 所以需要在做ajax请求的时候指定dataType.
  • 原来是不允许JQM加载跨域的JQM页面,但是这个版本新增了一个配置选项 $.mobile.allowCrossDomainPages 来支持http/https页面. 这个改动会导致URL可能出现这样的情况: file://dir1/dir2/myPhoneGapApp.html#https://myHomeServer.com/dir1/dir2/foo

以上这些问题在JQM alpha4里都得到了很好的解决,前提是使用jquery 1.5.1。

重要的升级注意事项

  • 列表li的html结构变化,可以用a标签直接包住li中需要链接的整个部分,比如图片,文字段落。
  • 由于WP7不支持动态插入viewport meta标签,所以现在推荐的方式是在每个页面上都放上meta标签,原来是由JQM的metaViewportContent 方法动态插入的,但是以后这个方法将被取消。为了避免影响已有的站点,JQM会在缺少meta标签的页面上直接插入了一个。
  • 原生的select选单将成为默认选项,这是出于性能问题考虑,如果你希望在alpha4中继续使用JQM定制的select选单,那么需要加上 data-native-menu=”false”

如何在jquery mobile中加载google map api

介绍一个用jquery mobile的ajax效果加载google map api,实现地图呈现的例子。

代码示例

首先是代码示例,使用iphone或android之类的手机查看,效果更佳
google map with jquery mobile

关键代码说明

map.js

map.js定义了加载地图的方法initiallize(),这个和常规网页中加载google map是一致的,因此这里不再细述。

map.html

地图的实际页面,在这个页面中不能直接加载google map的api,因为它是采用document.write再次写入script来实现的,所以我们采用callback的方式来加载它,见下面的代码:

head.js(
        "map.js",
        function() {
            head.js("http://maps.google.com/maps/api/js?sensor=true&callback=initialize");
        }
    );

首先用head.js把initialize方法装载进来,然后用callback方式调用google map api。你可以试试用最平常的方式加载这段代码,看看有什么效果。


<script src="map.js"></script>
<script src="http://maps.google.com/maps/api/js?sensor=true&callback=initialize"></script>