on()操作符可以添加或移除選擇集中每個(gè) DOM元素的事件監(jiān)聽函數(shù):
參數(shù)type是一個(gè)DOM事件類型字符串,指明要監(jiān)聽的事件,如: "click"、 "mouseover"、 "submit"等,可以使用瀏覽器支持的任何事件類型。
參數(shù)capture是可選的,對(duì)應(yīng)于W3C的useCapture標(biāo)志。
參數(shù)listener是可選的,如果未指定該參數(shù),則on()調(diào)用返回 type類型的當(dāng)前監(jiān)聽函數(shù)。
要移除一個(gè)事件監(jiān)聽,將listener參數(shù)置為null即可。
參數(shù)listener是一個(gè)監(jiān)聽函數(shù),當(dāng)d3捕捉到DOM事件后,將調(diào)用該監(jiān)聽函數(shù), 并忽略該函數(shù)的返回值。監(jiān)聽函數(shù)也是一個(gè)訪問器,d3觸發(fā)監(jiān)聽函數(shù)時(shí), 將this指向當(dāng)前的DOM對(duì)象,并以參數(shù)形式傳入其對(duì)應(yīng)的數(shù)據(jù)和在選擇集中的序號(hào)。
如果在同一個(gè)DOM對(duì)象上已經(jīng)注冊(cè)有type類型的監(jiān)聽函數(shù),那么再次調(diào)用on() 進(jìn)行注冊(cè)將移除之前注冊(cè)的監(jiān)聽函數(shù)。如果需要對(duì)一種事件注冊(cè)多個(gè)監(jiān)聽函數(shù),可以在 事件類型名稱后增加一個(gè)可選的命名空間,比如:"click.foo"、"click.bar"。
你可能已經(jīng)注意到,d3的事件監(jiān)聽函數(shù)在觸發(fā)時(shí),傳入的參數(shù)中沒有DOM事件對(duì)象。 這樣設(shè)計(jì)的出發(fā)點(diǎn)是讓監(jiān)聽函數(shù)可以和其他訪問器函數(shù)一樣,能夠獲得DOM對(duì)象對(duì)應(yīng) 的數(shù)據(jù)和序號(hào)。
但是,在很多應(yīng)用場(chǎng)景下,我們還是需要DOM事件對(duì)象,比如:
d3使用一個(gè)全局變量來提供DOM事件對(duì)象:d3.event。
d3.event僅在監(jiān)聽函數(shù)中有效。每當(dāng)事件觸發(fā)時(shí),d3就將DOM事件對(duì)象賦給d3.event, 并在監(jiān)聽器處理完之后將其清理。
d3.event就是你熟悉的Event對(duì)象,所以,隨便用。
盡管可以使用DOM事件對(duì)象的pageX和pageY獲得鼠標(biāo)位置,d3提供了更好用的方法:
參數(shù)container表示一個(gè)HTML元素,d3.mouse()將返回鼠標(biāo)位置相對(duì)于 這個(gè)容器元素的x、y坐標(biāo)。
這意味著對(duì)同一個(gè)鼠標(biāo)事件,我們只要傳入不同的容器元素,就可以獲得鼠標(biāo)位置 不同的相對(duì)位置!
解脫了很多令人煩躁的計(jì)算過程,對(duì)吧?
參考資料:http://www.hubwiz.com/course/54fd40cfe564e50d50dcf284/
聯(lián)系客服