1. 程式人生 > >d3事件(二):事件的觸發與自定義事件

d3事件(二):事件的觸發與自定義事件

      在第4版中,d3新增了事件的觸發函式dispatch,類似於jquery的trigger函式,用於觸發dom元素的事件處理函式。並且,d3的選擇集合還可以註冊任意名稱的事件與相關的事件處理函式,即自定義事件。

      假定頁面中還存在文章”d3事件(一):事件的註冊與名稱空間”的相關元素,基於此我們進行如下操作。

d3.selectAll('button')
  //    d代表繫結的資料,i代表元素在集合中的位置,group代表相關的元素集合
  .on('hello', function(d, i, group) {
       //   獲取事件物件
       var
event = d3.event, output = 'Hello,' + d.username; // 從event裡取出攜帶的資料 if(event.detail && event.detail.suffix) { output += event.detail.suffix } // 進行名稱的處理 alert(output); })

      因為hello不是html標準的事件型別,現在點選將無法觸發繫結的事件函式,這時則需要使用dispatch進行觸發。

//  觸發hello事件函式
d3.selectAll('button').dispatch('hello', {
                //  攜帶的資料會自動裝入到d3.event物件中
                detail : {
                    suffix : '!'
                }
            }); 
//  將會輸出"Hello,yiifaa!"字樣            

      dispatch能非常快捷地激發函式,並且能保留當前元素的上下文,如果需要更個性化、更強大的觸發函式,則需要使用customEvent。看customEvent這個名稱感覺像是定義個性化事件,然而它卻是用於事件的觸發,可以控制上下文、傳遞的資料以及對d3事件的包裝。

d3.customEvent(
    //  替換d3.event,如果在html的標準事件裡出發,如點選事件,還會將d3.event作為此物件的sourceEvent插入
    {
        detail : {
            prefix : '你好,'
        }
    }, 
    //  替換處理函式
    function(params) {
        var ev = d3.event;
        //  還可以獲取ev.sourceEvent,它指向之前發生的UI事件
        alert(ev.detail.prefix + this.datum().username +params.suffix);
    }, 
    //  替換處理函式的下上文,即處理函式的this
    d3.selectAll('button'), 
    //  處理函式的引數列表
    [{
        suffix : '!'
    }]
);
//  現在輸出的結果為"你好,yiifaa!"