Не могу передать функцию в качестве значения для setAttribute - PullRequest
0 голосов
/ 03 января 2012

У меня есть некоторый рабочий 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);

Ответы [ 2 ]

1 голос
/ 03 января 2012

Почему бы вам не использовать shape.addEventListener("mouseout", function() {...}, false) вместо этого?См. здесь для некоторых примеров.

Если вы хотите, чтобы объект события назывался evt в вашей функции, вы можете назвать его (вы можете дать ему любое имя), например: shape.addEventListener("mouseout", function(evt) {...}, false)

В противном случае переменная события по умолчанию имеет имя 'event' внутри функции слушателя, а не 'evt'.Это источник некоторой путаницы.

1 голос
/ 03 января 2012
popup_on  + "(evt,"+sindex+","+month+")"

рассматривается как «функция popup_on плюс строка» (evt, «плюс значение sindex plus ...» *

Это не интерпретируется как создание вызова функции.

Если вам нужно динамически построить его параметры, вы должны сделать что-то более похожее на

shape.setAttributeNS(null, "onmouseout",  function() {
    popup_off(evt,sindex);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...