扩展折线并处理鼠标事件

时间:2013-07-31 20:19:39

标签: google-maps-api-3 event-handling mouseevent polyline extending

我编写JS应用程序,我使用点数组绘制了很多折线,但是在这一点上我在这一点上有一些额外的属性(GPS数据,速度等)。

我想在onmouseover或onmouseclick事件上显示这些额外的道具。

我有两种方式:

  1. 使用标准折线和事件处理程序。但在这种情况下,我无法确定此折线起点的其他属性,因为我无法在折线属性中保存这些道具。有一个解决方案 - 保存在数组中的其他属性并尝试通过LatLng找到它们的折线的第一个点,但我觉得它太慢了..

  2. 扩展折线并在新对象中保存其他属性,但我不能扩展鼠标事件:(

  3. 要扩展折线,请使用以下代码:

    function myPolyline(prop, opts){
        this.prop = prop;
        this.Polyline = new google.maps.Polyline(opts);
    }
    
    myPolyline.prototype.setMap = function(map) {
        return this.Polyline.setMap(map);
    }
    
    myPolyline.prototype.getPath = function() {
        return this.Polyline.getPath();
    }
    
    myPolyline.prototype.addListener= function(prop) {
        return this.Polyline.addListener();
    } 
    
    myPolyline.prototype.getProp= function() {
        return this.prop;
    }
    
    myPolyline.prototype.setProp= function(prop) {
        return this.prop = prop;
    } 
    

    并在for循环中创建新对象(i - 点数组中当前点的索引),如下所示:

    var polyline_opts   = {
        path: line_points,
        strokeColor: color,
        geodesic: true,
        strokeOpacity: 0.5,
        strokeWeight: 4,
        icons: [
            {
            icon:   lineSymbol,
            offset: '25px',
            repeat: '50px'
            }
        ],              
        map: map
    };
    
    var add_prop    = {
        id:  i,
        device_id: device_id
    };
    
    ... 
    
    devices_properties[device_id].tracks[(i-1)] = new myPolyline(add_prop, polyline_opts);
    

    其中:

    • line_points - 点数组(仅两点),
    • i - 当前点索引
    • devices_properties [device_id] .tracks - 我的device_id索引的扩展折线数组(带添加属性)

    之后我设置了类似的事件处理程序:

    var tmp = devices_properties[device_id].tracks[(i-1)];
    google.maps.event.addListener(tmp.Polyline, 'click', function(e) {
    ...
    console.log(tmp.prop.id);
    ...
    }
    

    但在这种情况下,我总是在控制台中获得相同的ID ..

    当我使用

    google.maps.event.addListener(devices_properties[device_id].tracks[(i-1)].Polyline, 'click', function(e) {
    ...
    console.log(???); // How to get parent of polyline fired the event?
    ...
    }
    

    我不知道如何让折线的父母解雇这个事件?

1 个答案:

答案 0 :(得分:1)

我回答了我自己的问题 - 已经完成了,我只是在使用“for”代替“$ .each”:)时遇到了一些麻烦。

在我使用之前:

for ( i = 1; i < devices_properties[device_id].history_points.length; i++ ) {
    ...
    create myPolyline
    ...
}

并且它不起作用 - 创建了一个事件句柄。

后:

$.each(devices_properties[device_id].history_points, function(i, tmp){
    ...
    create myPolyline ()
    ...
}

并且它有效 - 创建了许多事件处理程序。

要处理事件我使用此:

google.maps.event.addListener(c_polyline.Polyline, 'mouseover', function(e) {
    var prop = c_polyline.getProp();
    ...
    console.log(prop.id, prop.device_id);
}