Как динамически добавить привязку к изображению

Когда мы используем Карты Google, после того, как мы что-то ищем, Google добавит маркер на карту. Когда мы нажмем на этот маркер, появится окно с подробной информацией, например:

введите здесь описание изображения

Я ищу «белый дом», затем создаю маркер «А».

Это несложно. Однако я нашел кое-что более интересное:

В представлении карты, даже если мы ничего не ищем, когда карта приближается к определенному уровню, будут сгенерированы некоторые якоря. Если навести на него мышку или щелкнуть, он что-то покажет соответственно, см. изображение:

введите здесь описание изображения

Здесь см. точку «14H и F st NW». Я его не искал, но он показал мне якорь. Когда я нажимаю на него, он показывает мне информационное окно соответственно.

Но когда я использую Firebug, чтобы посмотреть, что загружается, я обнаружил, что это просто изображения. Я не могу найти тег <a> в HTML.

Кроме того, через Firebug я обнаружил, что при изменении уровня карты браузер отправляет запрос на сервер, чтобы получить функции внутри текущего вида карты. Ответ в формате JSON. Он содержит местоположение и название объектов, а затем добавляет якоря на карту.

Но интересно, как они это реализуют?



Возможный способ реализации:

1) когда карта масштабируется или панорамируется, запрашиваются данные о местоположении объекта с сервера, предположим, что они получают следующие данные (например, возьмем белый дом):

данные:{{название:'белый дом',широта:-77 долгота:38}}

2) привязать событие мыши к div карты, что-то вроде этого:

$("#map").mousemove(function(e){
 for(var i=0;i<data.length;i++){
   if(e.clientX=getImageX(data[i].x) && e.clientY=getImageY(data[i].y)){
     //it mean that the mouse is overing this feature,now set the cousor and show the tip
     //show tip,see the iamge:
   }
 }

});

введите здесь описание изображения

3) привязать событие клика к div карты"

$("#map").mousemove(function(e){
 for(var i=0;i<data.length;i++){
   if(e.clientX=getImageX(data[i].x) && e.clientY=getImageY(data[i].y)){
     //it mean that the mouse is clicking this feature,show the infomation window
     //show tip,see the iamge:
   }
 }

});

Это то, что я могу думать до сих пор. Но, похоже, этого недостаточно, есть еще некоторые проблемы:

1) Информационное окно подсказки может отображаться только в том случае, если пользователь щелкает или наводит указатель мыши на ту самую точку, которая совпадает с широтой и долготой объекта, но на карте Google вы обнаружите, что если наведите указатель мыши на маркер (в любая точка маркера), кончик покажет. Область, в которой будет отображаться наконечник, такая же, как и область маркера.

Кажется, что Google делает что-то вроде этого:

$("#map").mousemove(function(e){
 for(var i=0;i<data.length;i++){
   if(e.clientX.insideTheMarker(data[i]) && e.clientY=insideTheMarker(data[i])){

     //it mean that the mouse is clicking this feature,show the infomation window
   }
 }
});

Но размер мардера не тот, как они рассчитывают реальную площадь, на которой будет отображаться наконечник?

2) в функции обработчика событий я перехожу к итератору всех функций, чтобы увидеть, соответствует ли текущее местоположение мыши какой-либо функции, если функций в текущем представлении карты так много, что это должно вызвать проблемы с производительностью.


person hguser    schedule 28.05.2011    source источник


Ответы (1)


Вероятно, это событие onclick для изображения или блока карты. Вы можете поместить обработчик onclick на любой элемент DOM. В этом случае они, вероятно, поместят событие в div карты, поскольку, вероятно, будет много изображений, на которых будут события, и это может быть проблемой производительности.

Когда вы обрабатываете событие click для дочернего элемента в родительском элементе, это называется делегированием события. jQuery предоставляет 2 функции для делегирования событий: .live и .delegate. Другие библиотеки также предоставляют эту функциональность, но вы можете прочитать об основах здесь общий обзор JavaScript или этот руководство по jQuery.

Вероятно, они делают что-то вроде (изменено из здесь):

// Get the map canvas  
var mapcanvas = document.getElementById('map_canvas');  

// Quick and simple cross-browser event handler - to compensate for IE's attachEvent handler  
function addEvent(obj, evt, fn, capture) {  
    if ( window.attachEvent ) {  
        obj.attachEvent("on" + evt, fn);  
    }  
    else {  
        if ( !capture ) capture = false; // capture  
        obj.addEventListener(evt, fn, capture)  
    }  
}  

// Check to see if the node that was clicked is an anchor tag. If so, proceed per usual.  
addEvent(mapcanvas, "click", function(e) {  
  // Firefox and IE access the target element different. e.target, and event.srcElement, respectively.  
  var target = e ? e.target : window.event.srcElement;  
  if ( target.nodeName.toLowerCase() === 'img' ) {  
     alert("clicked");  
     return false;  
  }  
}); 

Что касается того, чтобы изображение выглядело как якорь (т.е. значок указателя мыши), это можно установить с помощью css, установив свойство курсора:

#map_canvas img { cursor: pointer }
person lambacck    schedule 28.05.2011
comment
Может быть, вы меня неправильно поняли. Ничего не происходит, когда я нажимаю на изображение #map_canvas, информационное окно открывается, только если я нажимаю на самую точку внутри изображения. Кроме того, изображение не выглядит как якорь, просто точка внутри изображения выглядит как якорь при наведении на него курсора. - person hguser; 28.05.2011
comment
В этом случае они преобразуют местоположение экрана из клика в координату и таким образом выталкивают пузырь. Та же общая теория, другое состояние. Если вы используете их функции обработки событий, похоже, что вы получаете LatLng в место клика как часть события. После этого вы сможете использовать класс LatLngBounds. чтобы проверить, находится ли место, где щелкнул пользователь, в небольшом диапазоне точек, которые вы хотите. - person lambacck; 28.05.2011
comment
Спасибо за ваш ответ, мне действительно интересно, но я могу понять это, можете ли вы дать мне краткий пример? Сначала отобразить изображение, а затем создать якорь где-то на изображении? - person hguser; 28.05.2011
comment
@lambacck: я прочитал это руководство ссылка. Это связано с делегированием события, но в моем вопросе на карте Google я не могу найти привязку, созданную в html, что происходит? - person hguser; 29.05.2011
comment
@hguser: события щелчка имеют связанные с ними данные о положении мыши. Если вы нажмете на изображение и получите событие onclick на изображении, вы можете определить где на изображении вы щелкнули. Оттуда должен быть небольшой шаг к выяснению того, нажали ли вы что-то интересное, если вы знаете, где находятся интересующие вас вещи. - person lambacck; 29.05.2011
comment
@lambacck: спасибо за внимание. У меня есть идея реализовать это, но я не уверен, что это возможно, я обновил это в своем посте, вы можете проверить? - person hguser; 29.05.2011
comment
@lambacck: привет, не могли бы вы уделить немного времени, чтобы еще раз проверить мой обновленный пост? - person hguser; 31.05.2011