3

【GWT2.4、Chrome、Firefox】

やあ、

TreeView でツリー項目のドラッグ アンド ドロップを実装しています。ツリービューの横に、項目をインスタンス化し、ドラッグ アンド ドロップ ハンドラーを適用する管理クラスがあります。

これは次のようになります。

private CustomTreeItem createItem(Data data){
    CustomTreeItem item = new CustomTreeItem(data);
    if(dndApplicable())
        setupDndHandlers(item);
    return item:
}

private void setupDndHandlers(item){
    // The tree item's widget is a FocusPanel
    FocusPanel wrapper = item.getFocusPanel();

    wrapper.getElement().setDraggable(Element.DRAGGABLE_TRUE);

    // Setup the data and drag image when drag starts
    wrapper.addDragStartHandler(new DragStartHandler() {
        @Override
        public void onDragStart(DragStartEvent event) {
            event.getDataTransfer().setDragImage(wrapper.getElement(), 0, 0);
            event.setData("item_id", item.getData().getId().toString());
        }
    });

    // Each tree item can also be a drop target, so we add handlers accordingly
    wrapper.addDragLeaveHandler(new DragLeaveHandler() {
        public void onDragLeave(DragLeaveEvent event) {
            wrapper.removeStyleName("dragover");
            wrapper.removeStyleName("undroppable");
        }
    });

    // Each tree item can also be a drop target, so we add handlers accordingly
    wrapper.addDragOverHandler(new DragOverHandler() {
        public void onDragOver(DragOverEvent event) {
            if (isDroppable(event.getDataTransfer().getData("item_id"), item))
                wrapper.addStyleName("dragover");
            else
                wrapper.addStyleName("undroppable");
        }
    });

    // Each tree item can also be a drop target, so we add handlers accordingly
    wrapper.addDropHandler(new DropHandler() {
        public void onDrop(DropEvent event) {
            String id = event.getDataTransfer().getData("item_id");
            if (isDroppable(id, item)) {
                proceedWithDrop(id, item);
            }
    });

}

このisDroppable関数はいくつかのことをチェックします。1 つ目は、データが null または空であるかどうかです。

Firefox では問題なくイベント データにアクセスできますが、Chrome では DragOverHandler (またはそのことについては DragEnterHandler) 内で、dataTransfer を介してアクセスされるデータは空です。ただし、DropHandler 内では、データは正しいです。

私はそれを見なかったので、明らかなものを見逃していますか?

ありがとうございます。

4

1 に答える 1

3

これはプライバシーとセキュリティ上の理由から、設計どおりです。ここでは、Chrome は Firefox よりも HTML5 仕様をより厳密に実装しています。

http://www.w3.org/TR/html5/editing.html#drag-data-store-modeを参照してください

于 2013-09-19T22:11:08.680 に答える