У меня есть некоторый рабочий SVG-код, который обрабатывает события мыши, устанавливая атрибуты на фигуре:
function plot() {
...
shape.setAttributeNS(null, "onmouseover", "popup_on (evt,"+sindex+","+month+")");
shape.setAttributeNS(null, "onmouseout", "popup_off(evt,"+sindex+")");
}
Однако мне нужно изменить этот код, потому что popup_on
и popup_off
больше не являются статическимифункции, и им нужно много контекста в зависимости от того, откуда они вызываются.Я обрабатываю это, определяя замыкание и передавая имя функции в качестве значения атрибута:
function plot(popup_on, popup_off) {
...
shape.setAttributeNS(null, "onmouseover", popup_on + "(evt,"+sindex+","+month+")");
shape.setAttributeNS(null, "onmouseout", popup_off + "(evt,"+sindex+")");
}
Однако это не работает - всплывающий код никогда не запускается.Если я проверяю атрибуты 'shape' в Firebug или Dragonfly, они кажутся правильными.«shape» имеет атрибуты «onmouseover» и «onmouseout», а значением атрибута является полный исходный текст функций popup_on
и popup_off
:
onmouseover=function popup_on(evt, sindex, month) {
...
}
, но функции не являютсяна самом деле бежать.Есть идеи, что я делаю не так?Спасибо.
ОБНОВЛЕНИЕ
Спасибо за все отзывы.Марк ответ не работает;«функция» помечается как синтаксическая ошибка.'popup_on' и 'popup_off' не являются строками - они на самом деле являются функциями в замыкании.Ответы и Симе, и Эрика сработали, хотя и с одной проблемой.
Если я изменю код на этот:
shape.addEventListener("mouseover", function() {popup_on (evt, sindex, month);}, false);
, то firebug жалуется, что evt не определен при попыткевыполнить popup_on
(когда мышь нажмет).Если я изменю evt
на window.evt
или evt || window.evt
, я не получу эту ошибку, но у меня все еще не будет доступа к событию в обработчике всплывающих окон:
// popup handler in closure
o["popup_on"] = function(evt, sindex, month) {
// both evt and window.evt are undefined on entry
evt = evt || window.evt;
// so evt is still undefined, but...
...
// I need to do this
var upright = (evt.clientY >= cy);
Есть идеи почему?Спасибо.
ОБНОВЛЕНИЕ2
ОК - исправлено.Ответ:
shape.addEventListener("mouseover", function(evt) {popup_on (evt, sindex, month);}, false);
shape.addEventListener("mouseout", function(evt) {popup_off(evt, sindex);}, false);