cocos2d-js沒有完整的鼠標事件處理,這點比js/flash的要差一些,不過湊合着也可以用了。
一般界面編程,可以用顯示列表的Node作為監聽器的優先級,在上方的會比下方的高優先級。
而cocos2d-js沒有stopImmediatePropagation,只有stopProgapation,一旦某個監聽器中執行了stopProgapation,后續的監聽器都不會被執行。這里並沒有js/flash的冒泡概念。
如果在上層Node中stopProgapation,那么效果就有點像設置了swallowTouches:true,但會更靈活
例子:
界面上添加2個sprite,child1在下,child2在上。
如下的代碼,child2的監聽器優先級高,會首先執行,其中func2會先輸出,因為按順序執行,但由於stopProgapation,所以child1的監聽器不會被執行。
if("touches" in cc.sys.capabilities){ cc.eventManager.addListener({event: cc.EventListener.TOUCH_ONE_BY_ONE, onTouchBegan: function(){ trace("func1"); return true; }}, this.child1); cc.eventManager.addListener({event: cc.EventListener.TOUCH_ONE_BY_ONE, onTouchBegan: function(touch,event){ trace("func2"); //按順序執行,先func2,再func3 return true; }}, this.child2); cc.eventManager.addListener({event: cc.EventListener.TOUCH_ONE_BY_ONE, onTouchBegan: function(touch,event){ trace("func3"); event.stopPropagation(); return true; }}, this.child2); }else{ cc.eventManager.addListener({event: cc.EventListener.MOUSE, onMouseDown: function(){ trace("func1"); }}, this.child1); cc.eventManager.addListener({event: cc.EventListener.MOUSE, onMouseDown: function(event){ trace("func2"); //按順序執行,先func2,再func3 }}, this.child2); cc.eventManager.addListener({event: cc.EventListener.MOUSE, onMouseDown: function(event){ trace("func3"); event.stopPropagation(); }}, this.child2); }