Как заставить сгенерированные JavaScript карты изображений работать с Internet Explorer? - PullRequest
3 голосов
/ 15 апреля 2010

Я использую javascript для создания сетки высокого разрешения для изображения, которое я сгенерировал на веб-сервере. Сетка высокого разрешения состоит из элемента map с сотнями дочерних элементов area. Каждый элемент 'area' имеет атрибут onmouseover, который вызывает отображение всплывающего окна.

После назначения карты для img (через атрибут usemap) Internet Explorer игнорирует атрибут «onmouseover» элементов области, которые я добавил через javascript.

Поведение не вызвано синтаксическими различиями между IE и другими браузерами. Статическая карта ведет себя правильно. Только элементы, которые я динамически добавляю к существующей карте изображений, не могут запускать соответствующие им события наведения мыши.

Как заставить IE запустить событие наведения мыши для добавленных элементов 'area'?

function generate_image_map ( img ) { 
  var tile_width = 8;
  var tile_height = 10;
  var plotarea_left = 40;
  var plotarea_top = 45;
  var column_count = 100;
  var row_count = 120;

  var img_id = YAHOO.util.Dom.getAttribute(img, "id");
  var img_map_id = YAHOO.util.Dom.getAttribute(img, "usemap");
  var original_map = YAHOO.util.Selector.query(img_map_id)[0];

  var area_nodes = YAHOO.util.Selector.query("area", original_map);
  var last_node = area_nodes[area_nodes.length - 1];
  for (var y = 0; y < row_count; y++) {
    var top = Math.round(plotarea_top + (y * tile_height));
    var bottom = Math.round(plotarea_top + (y * tile_height) +
        tile_height);
    for (var x = 0; x < column_count; x++) {
      var left = Math.round(plotarea_left + (x * tile_width));
      var right = Math.round(plotarea_left + (x * tile_width) +
          tile_width);
      var area = document.createElement("area");
      YAHOO.util.Dom.setAttribute(area, "shape", "rect");
      YAHOO.util.Dom.setAttribute(area, "onmouseover",
        "alert('This does not appear in IE')"
      );
      var coords = [
        left, top,
        right, bottom
      ];
      YAHOO.util.Dom.setAttribute(area, "coords", coords.join(","));
      YAHOO.util.Dom.insertBefore(area, last_node);
    }
  }
}

Ответы [ 2 ]

1 голос
/ 21 декабря 2012

Хотя во времена IE4 и NS4 IE всегда был прощающим браузером, который поглощал все наши маленькие развивающиеся ошибки, кажется, что по крайней мере для этой функциональности IMG, MAP и AREA таблицы превращаются.

Динамически создавая и добавляя изображение с картой с областью с помощью createElement и appendChild, FireFox работает впервые, а IE - нет (теперь конец Win7 IE9!).

После всех проверок, настройки и настройки IE все равно не будет работать. Единственное решение, которое я смог найти для FF и IE, - это добавить в innerHTML то, что вы обычно печатаете в теле.

Я думал отлично! по крайней мере, решение, которое работает для обоих, но минуту спустя я не смог этого вынести, потому что я нахожусь на этом - по книге createElement и appendChild route - с помощью мне нравится последовательно создавать документы.

Я начал с кода createElement и appendChild для FF рядом с кодом innerHTML для IE. Затем я переместил тег IMG из innerHTML в маршруты createElement и appendChild. Это больше не работает для IE и начал пытаться и пытаться. Затем я проделал то же самое для других тегов и после попытки весь день, и в конце концов я обнаружил полный, но узкий путь для IE.

Для создания изображения:

//USE THIS:
img = new Image(width, height);
//DOES NOT WORK:
img = document.createElement('IMG');
img.width = width;
img.height = height;
//DOES NOT WORK:
img = new Image();
img.width = width;
img.height = height;

далее назначайте реквизиты, как .src как обычно.

Использовать свойства case-case в скрипте

//USE THIS:
img.useMap = '#myMap';
//DOES NOT WORK:
img.usemap = '#myMap';

HTML реквизиты чувствительны к регистру, но в скрипте они чувствительны к регистру.

И это недокументированное, очень забавное (не!) Для MS просто тупая ошибка / причудливость, которая все еще присутствует в IE9 после встроенного тега MAP начиная с IE4. Во всяком случае ...

//USE THIS:
map = document.createElement('MAP');
map.id = "myMap";
map.name = "myMap";
//DOES NOT WORK:
map = document.createElement('MAP');
map.name = "myMap";

В HTML IE использует свойство .name, но в скрипте IE использует свойство .id. В случае, если вы используете разветвление кода FF и IE, я все равно сохраню .name prop в коде IE на случай, если MS исправит это.

Наконец, вот рабочий кусок кода для IE и FF, использующий маршрут createElement и appendChild, да!:

document.write('<INPUT type="button" value="Dynamic Image Map" onclick="dynamicImageMap(32, 64)">');
function dynamicImageMap(ox, oy)
{
    var a, b, map, img, div, s;

    a = document.createElement('AREA');
    a.shape = 'rect';
    a.coords = '128,0,250,128';
    a.noHref = true;

    b = document.createElement('AREA');
    b.shape = 'rect';
    b.coords = '0,128,128,250';
    b.noHref = true;

    map = document.createElement('MAP');
    map.id = "myMap";
    map.name = "myMap";
    map.onclick = function(){ alert('myMap'); }

    map.appendChild(a);
    map.appendChild(b);

    img = new Image(250, 250);
    img.src = 'http://www.vectortemplates.com/raster/batman-logo-big.gif';
    img.border = 0;
    img.useMap = '#myMap';

    div = document.createElement('DIV');

    s = div.style;
    s.position = 'absolute';
    s.left = ox +'px';
    s.top = oy +'px';
    s.width = '250px';
    s.height = '250px';
    s.overflow = 'hidden';
    s.visibility = 'inherit';

    div.appendChild(map);
    div.appendChild(img);

    document.body.appendChild(div);
}

Области карты изображения делают нижнюю левую и верхнюю правую четверти изображения горячими для щелчка. Замените изображение src существующим src изображения, если оно больше не существует / работает.

Удачи и Фан!

1 голос
/ 04 мая 2010

решаемая.

Я пришел к выводу, что Internet Explorer не добавляет соответствующую обработку событий для динамически генерируемых элементов области. В то время как исходные элементы области будут вызывать события наведения мыши, динамически добавленные элементы - нет. Следующий код добавляет события наведения мыши к динамически добавляемым элементам области:

if (YAHOO.env.ua.ie > 0) {
  YAHOO.util.Event.addListener(original_map, "mousemove", function (e) {
    var area = YAHOO.util.Event.getTarget(e);
    var mouseover = YAHOO.util.Dom.getAttribute(area, "onmouseover");
    if (mouseover !== null) {
      eval("(function() {" + mouseover + "})();");
    }
  });
}

События при наведении курсора теперь запускаются, как и ожидалось, и моя динамически генерируемая карта изображений ведет себя как статическая в IE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...