【问题标题】:OpenLayers won't load without double click in PhoneGap/jQuery Mobile app如果没有在 PhoneGap/jQuery Mobile 应用程序中双击,OpenLayers 将不会加载
【发布时间】:2012-01-19 10:12:22
【问题描述】:

我在尝试将带有 Open Street Map 图层的基本 OL 地图集成到多页 jQuery Mobile HTML 界面时遇到了麻烦 - 它可以找到地图“div”,并​​且几乎可以正确加载所有内容,但是控件有在地图图块加载之前单击。这是地图代码:

var map, layer;
function init(){
    map = new OpenLayers.Map( 'map');
    layer = new OpenLayers.Layer.OSM( "Simple OSM Map");
    map.addLayer(layer);
    map.setCenter(
        new OpenLayers.LonLat(-71.147, 42.472).transform(
            new OpenLayers.Projection("EPSG:4326"),
            map.getProjectionObject()
            ), 12
        );
}

使用“ondeviceready”事件调用此函数,该事件在 PhoneGap 准备好接受命令时触发。这是包含地图的页面:

<!-- page showing map of route being recorded. -->
<div id="route" data-role="page">
    <div data-id="recRoute" data-role="header" data-position="fixed">
    </div>
    <div data-role="content">
        <div id="map"></div>
    </div>
    <div data-id="recRouteFoot" data-role="footer" data-position="fixed">
    </div>
</div>

当页面加载到 DOM 时,有什么方法可以让地图/图层重绘?我宁愿用户不必单击地图控件来实际查看地图。

更新:“路由”页面的“pageinit”处理程序:

/** Executes when gps page loads. **/
$('#route').live('pageinit', function(event){
        $('.del').detach().trigger('create');
        /** Executes when addTag button clicked. **/
        $('#createTag').click(createTag);
        /** Executes when getPic button clicked. **/
        $('#getPic').click(function() {
                getPic();
        });
        /** Executes when pauseResume button clicked. **/
        $('.pauseResume').click(function() {
                pauseCounter();
        });
        /** Executes when stop button clicked. **/
        $('.stop').click(function() {
                stopCounter();
        });
        // remove stupid button.
        $('#del').detach().trigger('create');
        // load map.
        init();
        $('#map').trigger('create');
        $('#route').addClass('ui-page-active').trigger('create');
});

【问题讨论】:

  • 我还要提一下,包含地图的页面并不是应用程序中要加载的第一个页面。
  • 似乎一起双击地图元素也会使地图出现。
  • 我尝试使用'.focus()'函数给地图元素焦点,但jQuery Mobile的内置刷新功能都不起作用。

标签: jquery-mobile cordova openlayers


【解决方案1】:

你应该只在初始化«#route»页面时创建地图,所以当它有维度时。

看看http://jquerymobile.com/demos/1.0/docs/api/events.html中的pageinit事件

【讨论】:

  • 我在我的应用程序中使用了该事件来添加按钮处理程序并制作 UI 处理程序,因此我将 init() 调用放在最后。它就像现在出现的地图一样工作,但现在“路线”页面是出现的第一页。我想这可能是因为我在它之前调用了一个触发函数,所以我把它放在了它之前。我已将事件处理程序的代码放在问题中。
  • 在触发器之前进行初始化调用让我回到了双击要求。我尝试了一些警报语句,似乎在创建地图后 init 中没有调用任何内容,或者在调用 init 后的事件处理程序。
  • $('#map').trigger('create'); $('#route').addClass('ui-page-active').trigger('create'); 为什么需要这样做?
  • 第一个命令是尝试刷新地图元素(失败并且在删除后不会改变情况),第二个命令使有问题的元素显示为活动 - 它是从另一个遗留下来的后来解决的问题。 - 换句话说,两者都不再需要了。
  • 好的,我已经弄清楚为什么在创建地图后什么都没有运行。我在函数调用上运行了一个 try/catch 语句,它给出了以下错误:'TypeError: 'null' is not an object'。我做了一些搜索,在 Firefox 中通过 firebug 运行脚本后,我想我遇到了与此处记录的相同的问题:trac.osgeo.org/openlayers/ticket/3385 - 如果我关闭对话框,我仍然可以在双击它后访问地图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多