2010-10-18 2 views
0

Я вкладывание onmouseout события окружности элемент Рафаэля, как это:Отсоединение элемент событие Рафаэль

(function(el,iElPos,col){ 
     el.mouseout(function elmouseout(){el.animate({"fill":col,"r":ELEMENT_RADIUS},150); 
           alert("first"); 
           fadeTag(); 
           });    
    )(c,i,elementColour); 

С является элементом. Я потом хочу, чтобы отключить события и прикрепить другой thuswise:

(function (el){ 
    el.attr("fill",EXCLUDED_COLOUR); 
    el.unmouseout(elmouseout); 
    el.mouseout(function elmouseout(){ 
         alert("second"); 
         el.animate({"fill":EXCLUDED_COLOUR,"r":ELEMENT_RADIUS},150); 
         fadeTag(); 
         }); 
})(setMainSeries[iPos]); 

Но это придает оба события. Оба предупреждения срабатывают, сначала запускается событие с последним подключением. Я хочу полностью отключить первое событие. Я использую unmouseout() неправильно?

UPDATE

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

function elmouseoutDefault(el){ 
    el.animate({"fill":ELEMENT_COLOUR,"r":ELEMENT_RADIUS},150); 
    alert("first"); 
    fadeTag(); 
}; 

прикрепляет событие, как это, как я создал каждый элемент ...

el.mouseout(elmouseoutDefault); 

Однако это не удалось, как я не проходя el. Так что я изменил его ...

el.mouseout(elmouseoutDefault(el)); 

Это, кажется, называют elmouseoutDefault, как он добавляется. Я просто хочу, чтобы он запускался в событии mouseout.

+0

как насчет публикации полного нерабочего примера? довольно сложно определить вашу проблему, когда вы не рассказываете нам все, что вы делаете. – lincolnk

+0

@ lincolnk - Да, я знаю, что это неудобно. Я мог бы опубликовать весь код, но это были бы страницы и страницы. Однако я нашел обходное решение. Спасибо за вашу помощь. –

ответ

0

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

var elmouseout = null; 

(function (el, iElPos, col) { 

    elmouseout = function() { 
     el.animate({"fill": col, "r": ELEMENT_RADIUS }, 150); 
     alert("first"); 
     fadeTag(); 
    }; 

    el.mouseout(elmouseout); 

})(c, i, elementColour); 


(function (el) { 

    el.attr("fill", EXCLUDED_COLOUR); 

    el.unmouseout(elmouseout); 

    elmouseout = function() { 
     alert("second"); 
     el.animate({ "fill": EXCLUDED_COLOUR, "r": ELEMENT_RADIUS}, 150); 
     fadeTag(); 
    }; 

    el.mouseout(elmouseout); 

})(setMainSeries[iPos]); 

редактировать: это сфера thing- ваше определение elmouseout существует только в пределах самоосуществляющихся функций. Я думал о другой проблеме, касающейся имен функций. код все равно должен работать.

+1

Нет ничего плохого в объявлении именованной функции inline. Это всего лишь декларация внутренней функции, которая полностью легальна в js и является эквивалентом создания анонимной функции и присваивает ее локальной переменной с помощью «var». Проблема заключается в том, что вторая область пытается ссылаться на переменную, определенную в первой области. Я думаю, что код, который вы здесь представили, будет работать правильно. – jbeard4

+0

@ echo-flow спасибо, у меня было это в голове, когда я писал это, но он не нажимал, пока я не прочитал ваш комментарий. – lincolnk

+0

Привет, это, похоже, не отключает событие. Такое же поведение, как и раньше: (... –

0

Я хотел бы подтвердить это против вашего рабочего кода, но на основе кода, который вы опубликовали, вот что, я думаю, происходит: в обоих фрагментах кода вы объявляете функцию «elmouseout». Синтаксис объявления функции, который вы используете, объявляет функцию в локальной области (эквивалент записи «var elmouseout = function() {...}»), и потому, что вы объявляете каждую внутреннюю часть отдельного закрытия функции, переменная " elmouseout "во втором блоке кода относится к функции elmouseout из второго блока кода, а не к первому блоку кода, что даст желаемое поведение. Я бы рекомендовал разложить декларации функций следующим образом:

function elmouseout(e){e.target.animate({"fill":col,"r":ELEMENT_RADIUS},150); 
           alert("first"); 
           fadeTag(); 
           } 

    (function(el,iElPos,col){ 
     el.mouseout(elmouseout);    
    )(c,i,elementColour); 


function elmouseout2(e){ 
         alert("second"); 
         e.target.animate({"fill":EXCLUDED_COLOUR,"r":ELEMENT_RADIUS},150); 
         fadeTag(); 
         } 

(function (el){ 
    el.attr("fill",EXCLUDED_COLOUR); 
    el.unmouseout(elmouseout); 
    el.mouseout(elmouseout2); 
})(setMainSeries[iPos]); 
+0

Привет, это не работает, см. мое обновление. –

+0

Я модифицировал обработчики событий, чтобы принять событие, и удалить элемент цели из события. Я думаю, что приведенный выше код должен работать правильно Если вам нравится, не стесняйтесь ссылаться на живой образец, чтобы я мог его проверить. – jbeard4

+0

Спасибо за ваше обновление. Я еще не смог его попробовать, так как нашел обходной путь. Возможно, я вернусь к этому позже на этой неделе, и попробуйте код в моей исторической версии. Спасибо. –

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

  • Нет связанных вопросов^_^