【问题标题】:Info box for Bing Maps必应地图的信息框
【发布时间】:2012-08-07 03:15:22
【问题描述】:

我目前正在开发一个 bing 地图应用程序,当用户单击图钉时,我似乎无法显示信息框。我一直在关注SDK,它应该几乎完全一样。这是我所拥有的:

// ***********************************
// Function creates a single pin
// and returns a reference to the pin

function createMapPin(latLong, sName) {
    var pinImg = "imagespins/Good.png";


var pin = new Microsoft.Maps.Pushpin(latLong, {
    icon: pinImg,
    anchor: new Microsoft.Maps.Point(8, 8),
    draggable: true,
    width: 48,
    height: 48
});

pin.title = sName;


pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
            { title: 'My Pushpin',
                description: 'This pushpin is located at (0,0).',
                visible: false,
                offset: new Microsoft.Maps.Point(0, 15)
            });



// Add handlers for the pushpin events
   Microsoft.Maps.Events.addHandler(pin, 'click', displayInfobox);
// Hide the infobox when the map is moved.
Microsoft.Maps.Events.addHandler(map, 'viewchange', hideInfobox);

map.entities.push(pin);
map.entities.push(pinInfobox);

    return pin;
}

function displayInfobox(e) {
    pinInfobox.setOptions({ visible: true });
}


function hideInfobox(e) {
    pinInfobox.setOptions({ visible: false });
}

引脚成功创建并添加到地图中,当用户单击引脚时,它确实进入了 dispayInfoBox 方法,但消息框似乎没有出现。

任何建议都非常感谢。谢谢!

【问题讨论】:

    标签: javascript web-applications bing-maps


    【解决方案1】:

    你的代码有效,我试过了,只要你只调用一次createMapPin()。但是从您的代码来看,您的意图是多次调用createMapPin(),这将导致infobox 停止像您想象的那样运行。原因是这一行:

    pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
                { title: 'My Pushpin',
                    description: 'This pushpin is located at (0,0).',
                    visible: false,
                    offset: new Microsoft.Maps.Point(0, 15)
                });
    

    由于您没有通过 var 关键字将 pinInfobox 声明为局部变量,因此它被隐式声明为全局变量。我不认为这是你的意图,因为一旦你再次调用createMapPin()pinInfobox,因为它是一个全局变量,将被覆盖。所以实际上,即使你继续创建新的信息框,它也只有一个实例,它只是不断地获得分配的新值。因此,如果您单击图钉,则一个信息框可能会在屏幕外的某个地方弹出,而您看不到它。我相信您的意图是让每个图钉关联一个信息框?为此,您需要将信息框声明为局部变量,如下所示:

    var pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
            { title: 'My Pushpin',
                description: 'This pushpin is located at (0,0).',
                visible: false,
                offset: new Microsoft.Maps.Point(0, 15)
            });
    

    您还需要修改事件处理程序以与信息框对象的本地版本进行交互,而不仅仅是单个全局变量。最简单的方法是将事件处理程序声明为 createMapPin() 函数范围内的匿名函数,并使用函数绑定覆盖 this 关键字的含义:

    Microsoft.Maps.Events.addHandler(pin, 'click', function (e) {
        this.setOptions({ visible: true });
    } .bind(pinInfobox));
    Microsoft.Maps.Events.addHandler(map, 'viewchange', function(e) {
        this.setOptions({ visible: false });
    }.bind(pinInfobox));
    

    所以这是你的更新代码:

    function createMapPin(latLong, sName) {
        var pinImg = "imagespins/Good.png";
    
        var pin = new Microsoft.Maps.Pushpin(latLong, {
            icon: pinImg,
            anchor: new Microsoft.Maps.Point(8, 8),
            draggable: true,
            width: 48,
            height: 48
        });
    
        pin.title = sName;
    
        var pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
            {
                title: 'My Pushpin',
                description: 'This pushpin is located at (0,0).',
                visible: false,
                offset: new Microsoft.Maps.Point(0, 15)
            });
    
        // Add handlers for the pushpin events
        Microsoft.Maps.Events.addHandler(pin, 'click', function(e) {
            this.setOptions({ visible: true });
        }.bind(pinInfobox));
        // Hide the infobox when the map is moved.
        Microsoft.Maps.Events.addHandler(map, 'viewchange', function(e) {
            this.setOptions({ visible: false });
        }.bind(pinInfobox));
        map.entities.push(pin);
        map.entities.push(pinInfobox);
        return pin;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      相关资源
      最近更新 更多