2009-03-29 3 views
1

Я только что построил SVG-карту Новой Зеландии для использования с превосходной библиотекой javascript Raphael, но, к сожалению, наткнулся на то, что я могу только представить, это ошибка или синтаксическая вариация в IE javascript-интерпретатор.События работают в Firefox/Chrome, но не работают в IE

В Firefox и других браузерах события onlick и onmouseover работают отлично - однако они не срабатывают в IE (протестировано в IE 7). К сожалению, нет ошибки javascript, чтобы помочь мне отладить это, поэтому я могу только предположить, что IE обрабатывает эти события каким-то принципиально иным способом.

<script type="text/javascript" charset="utf-8"> 
    window.onload = function() { 
     var R = Raphael("paper", 450, 600); 
     var attr = { 
      fill: "#3f3f40", 
      stroke: "#666", 
      "stroke-width": 1, 
      "stroke-linejoin": "round" 
     }; 
     var nz = {}; 
     nz.northland = R.path(attr, "M 193.34222,3.7847503 C 194.65463"); 
       // SVG data stripped for sake of brevity 
     var current = null; 
     for (var region in nz) { 
      nz[region].color = Raphael.getColor(); 
      (function(rg, region) { 
       rg[0].style.cursor = "pointer"; 
       rg[0].onmouseover = function() { 
        current && nz[current].animate({ fill: "#3f3f40", stroke: "#666" }, 500) && (document.getElementById(current).style.display = ""); 
        rg.animate({ fill: rg.color, stroke: "#ccc" }, 500); 
        rg.toFront(); 
        R.safari(); 
        document.getElementById(region).style.display = "block"; 
        current = region; 
       }; 
       rg[0].onclick = function() { 
        alert("IE never gets this far."); 
        //window.location.href = "my-page.aspx?District=" + region; 
       }; 
       rg[0].onmouseout = function() { 
        rg.animate({ fill: "#3f3f40", stroke: "#666" }, 500); 
       }; 
       if (region == "northland") { 
        rg[0].onmouseover(); 
       } 
      })(nz[region], region); 
     } 
    }; 
</script> 

Большое спасибо :)

ответ

3

Исправление похоже на использование события onmousedown вместо onclick.

Изменение:

rg[0].onclick = function() { 
alert("IE never gets this far, but Firefox is happy."); 
}; 

в

rg[0].onmousedown = function() { 
alert("This works in IE and Firefox."); 
}; 

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

+0

Вы могли бы избежать множества проблем, подобных этому, просто приняв фреймворк, который решил проблемы с перекрестным браузером для вас, такие как jQuery, dojo, mootools или prototype/scriptaculous , – tvanfosson

+0

Хорошее предложение - явно хорошее время для улучшения моего jquery-fu. Спасибо :) –

+0

Это более конкретный случай: вы смотрите на поддержку событий для элементов SVG. Это не то же самое, что поддержка кросс-браузера на стандартных элементах HTML. Это может быть (я не проверял), что IE не поддерживает события mousedown и mouseup на элементе SVG. – 2009-06-15 08:46:52

1

Вы пробовали прикрепление события?

if (rg[0].attachEvent) 
    rg[0].attachEvent("onclick", function(){ /* IE */ }); 
else 
    rg[0].addEventListener("click", function(){ /* other */ }, false); 
+0

Мне нравится, что это больше соответствует рекомендациям W3C, но, к сожалению, эта же проблема сохраняется. Однако следующее работает: if (rg [0] .attachEvent) rg [0] .attachEvent («onmousedown», function() {/ * IE * /}); –

+0

Прошло некоторое время с тех пор, как я работал с собственными обработчиками событий в javascript. Библиотеки, подобные JQuery, делают меня испорченной. ;) – Joel

0

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

+0

Уточненный в сообщении спасибо - проверено в IE 7 –

0

Как правило, структура абстракции, такая как jquery или prototype, является вашим лучшим выбором. Они обрабатывают различия браузера для вас. Кроме того, вы можете подписаться на свои мероприятия на более высоком уровне ... в браузере менее дорого, чтобы подписаться на mousemove/click, и определить, что вы закончили, или щелкнуть мышью от пузыря события, чем на многие объекты.

Joel Potter упомянул модель абонента, используя методы dom и IE, что лучше, чем назначение метода.

Смежные вопросы