【问题标题】:Attach event handler to element inside google maps info bubble将事件处理程序附加到谷歌地图信息气泡内的元素
【发布时间】:2012-04-21 01:30:10
【问题描述】:

我有一个关于谷歌地图和事件处理/监听的问题。

使用 jQuery 和 google maps v3,我可以放置一个地图标记和一个事件侦听器,当用户单击标记时会打开一个信息气泡。我想做的(但到目前为止还没有弄清楚)是将另一个事件处理程序添加到信息气泡的内容中。例如,如果用户单击地图标记打开信息气泡(该部分有效),然后如果他们单击信息气泡内的某些内容,则执行其他操作。我已经在下面粘贴了我的代码,提前感谢您的帮助

function addMarker(data) {
    var myLatlng = new google.maps.LatLng(data.Latitude, data.Longitude);
    var title = data.title? data.title: "";
    var icon = $('#siteUrl').val() + 'img/locate.png';

var bubbleContentString = "<span class=\"bubble-details-button\">Get Details about " + title+ "</span>";

myInfoBubble = new InfoBubble({
    content: bubbleContentString,
    hideCloseButton: true,        
    backgroundColor: '#004475',
    borderColor: '#004475'
});

var myMarker =  new google.maps.Marker({
        position: myLatlng,
        map: map,
        title: title,
        icon: icon
    });    
addListenerToMarker(myMarker, myInfoBubble);
markerSet.push(myMarker, myInfoBubble);    
}
function addListenerToMarker(marker, bubble){
    console.log($(bubble.getContent()).find('.bubble-details-button')[0]);
    google.maps.event.addListener(marker, 'click', function() { 
        if (!bubble.isOpen()) {  
            google.maps.event.addListenerOnce(bubble, 'domready', function(){ 
                console.log($(bubble.getContent()).find('.bubble-details-button')[0]);
                google.maps.event.addDomListener($(bubble.getContent()).find('.bubble-details-button')[0], 'click', function(){ 
                    alert("hi"); 
                }); 
            });
            bubble.open(map, marker); 
        }     
    });
}  

【问题讨论】:

    标签: jquery google-maps-api-3 google-maps-markers


    【解决方案1】:

    在我必须执行您所描述的操作的情况下,我会在 InfoBubble 内容中直接包含一个 JavaScript 函数调用。我经常在 InfoBubble 中包含超链接,所以在这种情况下,我会执行以下操作: 1 - 编写一个 JavaScript 函数来处理超链接点击。 2 - 创建标记。 3 - 将单击事件处理程序附加到打开 InfoBubble 的标记。 4 - 定义 InfoBubble 的内容,以便将直接嵌入在 InfoBubble 内容中的 JavaScript 设置为通过调用在步骤 #1 中定义的 JavaScript 函数来处理点击事件 - 类似于:

    "<span>" +
         "<a href='javascript:showDetail(" + param1 + "," + param2 + ");'>" + 
          displayTextContent + "</a>" +
    "</span>"
    

    【讨论】:

    • 哦不错..哈哈哈...我怎么会忘记这个简单的解决方案..谢谢:)
    【解决方案2】:

    您正在尝试在元素上添加 "click" 事件,而不是 DOM Element$('.bubble-details-button') 不是DOM Element(它是DOM Element 的包装),但$('.bubble-details-button')[0] 是。

    另一方面,当您尝试添加"click" 事件时,尚未创建内容。您可以使用内容的元素(例如添加事件),只有当它们已经创建时。 InfoBubble 将触发"domready" 事件,当它的内容将被创建。所以你需要处理它:

     if (!bubble.isOpen()) {
        google.maps.event.addListenerOnce(bubble, 'domready', function(){
            google.maps.event.addDomListener($(bubble.getContent()).find('.bubble-details-button')[0], 'click', function(){
                alert("hi");
            });
        });
        bubble.open(map, mymarker);        
    }
    

    【讨论】:

    • 您说的很有道理,但是我尝试实施您的建议,但没有成功。我复制并粘贴了您的建议,但是气泡本身并没有打开,所以我什至无法点击气泡内的内容
    • 抱歉,这并不完全正确。我的原始代码中有一个错字。我修正了那个错字,它在我调用 google.maps.event.addListener(marker, 'click', function() { marker should have read, mymarker. 但是,修正错字会导致错误当我单击地图中的标记时,错误消息是:Microsoft JScript 运行时错误:无法获取属性“addEventListener”的值:对象为空或未定义
    • 抱歉,回复晚了。你能检查一下这个console.log($(bubble.getContent()).find('.bubble-details-button')[0]) 吗?是 DOM 元素吗?
    • 无需道歉,谢谢您的回复。我得到以下信息: LOG: undefined 我觉得我没有给你完整的故事。我最初发布的代码稍微简化了,因为我实际上是通过一组标记并通过另一个事件添加侦听器(否则我最终每个气泡都会获得相同的内容)。我已经编辑了上面的代码(出于某种原因等待同行评审)以反映我正在使用的实际工作代码。
    • 我认为我的代码有一个单独的问题,因为我已经在另一个项目中尝试过这个作为测试并且它有效,我会做一些调试来跟踪错误,但就最初的问题是这个解决方案有效,感谢您的帮助
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多