2015-11-16 39 views
2

請注意這兩個草圖,one具有預期的和期望的行爲,而one則不會。當你打開這些草圖時,你會看到一張帶有一些文字的圖像。文本可拖動到新的位置。在重新定位期間,圖像應該保持文具。在第一個草圖中,第二個草圖沒有。Paper.js圖層事件與工具事件 - 不同行爲

兩個小品之間的代碼不同的是,在第一個活性層上建立的事件:

project.activeLayer.onMouseDrag = function(event) { 
    view.center = changeCenter(paper.view.center, event.delta.x, event.delta.y, 0.7); 
} 

在它是在我的理解是在全球設立的第二個paper.tool

function onMouseDrag(event) { 
    view.center = changeCenter(paper.view.center, event.delta.x, event.delta.y, 0.7); 
} 

在我看來,它不應該在text mousedrag聽衆,我停止事件的傳播關係,因爲

event.stopPropagation(); 

但是,這似乎只在第一個草圖中生效,而不是在第二個草圖中生效。爲什麼會這樣?

+0

用簡潔的代碼來說明它的很好的孤立問題。 – bmacnaughton

回答

1

區別在於聲明「全局」函數onMouseDrag會導致紙張創建Tool,並且在處理結束時調用工具事件,無論正常處理程序鏈是否要求停止傳播。 (我說「全局」是因爲當紙張執行紙質腳本時,它會將你的代碼封裝在一個具有自己範圍的函數中,然後將這些「全局」函數傳回給從該函數返回的對象中的紙張。)如果有任何「全局」函數被宣佈爲紙張,然後創建一個處理它們的工具。無論您的處理程序是否終止處理,該工具在事件處理結束時被調用。

下面的代碼是在紙的View.js模塊的相關代碼:

function handleMouseMove(view, point, event) { 
    view._handleEvent('mousemove', point, event); 
    var tool = view._scope.tool; 
    if (tool) { 
     tool._handleEvent(dragging && tool.responds('mousedrag') 
       ? 'mousedrag' : 'mousemove', point, event); 
    } 
    view.update(); 
    return tool; 
} 

該項目的處理程序(您PointText處理)是由view._handleEvent()稱爲雖然這是含蓄地定義了「全球」 onMouseDrag創建的工具被稱爲不管view._handleEvent處理的結果。

如果您使用paperscript並且聲明全局函數之一(例如onMouseDrag),則只會出現此問題。