2010-10-18 67 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); 

c是元件。然後我後來想斷開事件,並附加其他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 2010-10-19 13:24:44

+0

@lincolnk - 是的,我知道這讓它很尷尬。我可以發佈所有的代碼,但它會是頁面和頁面。儘管我已經找到了解決方法。謝謝你的幫助。 – 2010-10-19 15:16:52

回答

0

它看起來像是在聲明函數名稱的位置的問題 - 我認爲當您使用名稱內聯函數定義函數時,事情會變得棘手。這應該更可靠地爲參考保留一個函數。

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]); 

編輯:這東西─只存在自調用函數的範圍內,你的elmouseout定義一個範圍。我正在考慮關於函數名稱的另一個問題。該代碼應該仍然工作。

+1

以內聯方式聲明命名函數沒有任何問題。這只是一個內部函數聲明,它在js中是完全合法的,相當於創建一個匿名函數,並使用「var」將其分配給一個局部變量。問題在於第二個作用域試圖引用在第一個作用域中定義的變量。我認爲你在這裏提出的代碼會正常工作。 – jbeard4 2010-10-18 16:50:43

+0

@回聲流感謝,我在寫這篇文章的時候在我的腦海中,但是直到我閱讀了您的評論才點擊。 – lincolnk 2010-10-18 16:59:50

+0

嗨,這似乎仍然不會中斷事件。 (... – 2010-10-19 08:14:59

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

嗨,這是行不通的,請參閱我的更新 – 2010-10-19 08:23:22

+0

我修改了事件處理程序接受事件,並將元素目標從事件。我認爲上述代碼現在應該正常工作。如果你喜歡,隨時鏈接到一個實況樣本,以便我可以驗證它。 – jbeard4 2010-10-19 09:52:30

+0

感謝您的更新。我還沒有能夠嘗試它,因爲我找到了解決方法。我可能會回到這個但在本週的後期,請在我的歷史版本上試用您的代碼。謝謝。 – 2010-10-19 15:17:46