2012-04-08 62 views
5

我有一个关于谷歌地图和事件处理/听力的问题。将事件处理程序附加到谷歌地图内的元素信息气泡

使用jQuery和谷歌地图v3,我可以放置地图标记和事件侦听器,当用户单击标记时打开一个infobubble。我想做什么(但到目前为止还没有弄清楚)是为信息泡泡的内容添加另一个事件处理程序。例如,如果用户点击地图标记打开信息泡泡(该部分起作用),然后如果他们点击泡泡内的某些东西做其他事情。我在下面贴上我的代码,在此先感谢您的帮助

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); 
     }  
    }); 
} 

回答

5

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

另一方面,当您尝试添加"click"事件时,内容尚未创建。只有在已经创建了内容元素的情况下,您才能处理(例如添加事件)内容的元素。该InfoBubble将触发"domready"事件,当它的内容将是created.So你需要处理:

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);   
} 
+0

你在说什么是有道理的,但是我试图实施你的建议,我没有成功。 我做了一个复制并粘贴了你的建议,但是泡沫本身并没有打开,所以我甚至无法点击泡泡内的内容 – 2012-04-09 03:15:26

+0

对不起,这不完全正确。我原来的代码中有一个错字。我修正了这个错字,它在我曾打电话给google.maps.event.addListener的位置(标记,'click',function(){ marker should have read,mymarker。 但是,修正了错字结果在我点击地图上的标记时出现错误,错误消息是: Microsoft JScript运行时错误:无法获取属性'addEventListener'的值:对象为null或undefined – 2012-04-09 03:42:03

+0

对不起,对于迟到的回复。检查这个'console.log($(bubble.getContent())。find('。bubble-details-button')[0])'?是否DOM元素? – Engineer 2012-04-09 18:48:51

3

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

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

这种解决方案也为我工作 – 2012-04-13 15:17:04

+0

哦不错..hahahaha ...我怎么能忘记这个标准的解决方案..谢谢:) – cjmling 2012-12-14 05:48:11