1

好吧,我已經在幾天前的最後一個問題後取得了一些進展,但在JavaScript和Three.js方面我還是很新的,並且正在遇到這個新問題。Javascript CustomEvent的詳細信息是否爲空?

我試圖通過一個OBJ文件加載一些three.js幾何作爲與自定義事件相關的細節,以便我可以進一步處理它。這是有道理的做這樣的OBJLoader異步運行:

function loadObjAsMesh(obj) { // Obj Resource URL: Example: 'assets/monster.obj' 
 

 
\t var geometry; 
 
\t var mesh; 
 

 
\t loader = new THREE.OBJLoader(); 
 
\t \t \t 
 
\t console.log('About to call loader.load'); \t \t 
 
\t \t \t 
 
\t loader.load(
 
\t \t obj , function (object) { 
 
\t \t 
 
\t \t \t console.log('Starting to run loader.load CALLBACK'); 
 
\t \t \t 
 
\t \t \t geometry = new THREE.Geometry().fromBufferGeometry(object.children["0"].geometry); 
 
\t \t \t \t \t \t 
 
\t \t \t mesh = new THREE.Mesh (geometry, sceneEntities.materials.bluePhongSolid); 
 
\t \t \t 
 
\t \t \t console.log(mesh); 
 
\t \t \t 
 
\t \t \t scene.add(mesh); 
 
\t \t \t 
 
\t \t \t console.log ('About to dispatch the Finished Loading Event'); 
 
\t \t \t 
 
\t \t \t dispatchEvent(sceneSyntheticEvents.objectFinishedLoading, { 
 
\t \t \t \t detail : { 
 
\t \t \t \t \t passedMesh : mesh 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t } \t \t \t \t \t 
 
\t \t \t \t); 
 
\t \t \t 
 
\t \t \t console.log ('Just Dispatched the Finished Loading Event'); 
 
\t \t \t console.log (sceneSyntheticEvents.objectFinishedLoading); 
 
\t \t \t 
 
\t \t \t console.log('Done running loader.load CALLBACK'); \t \t 
 
\t \t 
 
\t \t \t } \t); 
 
\t 
 
\t console.log('Done calling loader.load'); 
 
}

然後,這裏的事件監聽:

function events() { 
 
\t 
 
\t sceneSyntheticEvents.objectFinishedLoading = new CustomEvent('objectFinishedLoading'); 
 
\t 
 
\t console.log ('About to catch the Finshed Loading Event'); 
 
\t 
 
\t addEventListener('objectFinishedLoading', function (e) { console.log (e.detail.passedMesh); }, false); 
 
\t 
 
\t console.log ('Just Caught the Finished Loading Event'); 
 
}

事件是成功開火併聽取了聽衆的意見。問題是event.detail爲空。我嘗試過幾種不同的格式化細節 - 沒有骰子,所以我很確定這不是語法或約定的問題。

我已經在應用程序中看到了一大堆儀器,正如您所看到的,清楚地表明問題一旦事件觸發就會發生。這並不是說聽衆沒有得到e.detail。不知何故,細節並沒有被包含在事件發生的瞬間。

我甚至嘗試用一些不同的方法測試整數,認爲問題是網格。我想這比如:

\t \t \t dispatchEvent(sceneSyntheticEvents.objectFinishedLoading, { 
 
\t \t \t \t detail : { 
 
\t \t \t \t \t passedMesh : "32" 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t }

和...

\t \t \t dispatchEvent(sceneSyntheticEvents.objectFinishedLoading, { 
 
\t \t \t \t detail : "32" 
 
\t \t \t \t \t }

即使如此,控制檯報告:

CustomEvent {isTrusted: false, detail: null, type: "objectFinishedLoading", target: Window, currentTarget: Window…}

細節:空? 「detail」用引號引起來,而不是用引號引起來,沒有差異。

我很清楚這一點在我的頭上。有任何想法嗎?

謝謝。

回答

1

dispatchEvent方法採用單個參數event object

您需要將detail對象傳遞給事件構造函數。在你的情況下,你將事件選項作爲第二個參數傳遞給dispatchEvent,這不會有任何影響。

addEventListener('my-custom-event', function(e) { 
 
    console.log('event handler', e.type); 
 
    console.log(e.detail) 
 
}, false); 
 

 
var event = new CustomEvent('my-custom-event', { 
 
    detail: { 
 
    key: 'detail-value' 
 
    } 
 
}) 
 
dispatchEvent(event);

+0

謝謝!像魅力一樣工作!我現在想知道這是否顯示在我一直檢查的所有文檔中?感謝Arun P Johny爲我挽救了頭痛。 –

+0

@MarkScottLavin如果你看看我上面提到的文檔,很明顯'dispatchEvent'只有一個參數 –