我正在使用GWT 2.5,我想在另一个Panel中的一个Panel Draggable和Dropable中制作一些图像。这在Firefox上工作正常,但在IE9上它只是不想工作。
我几乎整天搜索,并没有找到任何解决方案。我找到的最好的主题就是这些:
GWT native drag & drop - DragStartEvent not firing on IE9
不同之处在于我拖动图片,而不是标签。所以这可能是问题所在。
所以代码看起来像这样:
// Draggable Image
final Image img = new Image(imageName);
img.addDragStartHandler(new DragStartHandler() {
@Override
public void onDragStart(final DragStartEvent event) {
event.setData("text", img.getUrl());
}
});
img.getElement().setDraggable(Element.DRAGGABLE_TRUE);
然后我把它放在我的“来源”面板中:
// Image in the source container
wunschContainer = new AbsolutePanel();
img.setPixelSize(size, size);
wunschContainer.add(img, left, top);
图像显示正确(Firefox和IE9)
目标面板看起来像这样(它是AbsolutePanel的子类,并实现了HasDragOverHandlers和HasDropHandlers)
// Event-handlers for the target container.
this.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(final DragOverEvent event) {
}
});
this.addDropHandler(new DropHandler() {
@Override
public void onDrop(final DropEvent event) {
event.preventDefault();
final String data = event.getData("text");
/* ... some more handling ..., creates an image to be displayed here */
add(image, left, top);
}
});
在Firefox中,当我拖动图像时,拖动图像显示在鼠标指针下方。在IE9上我根本看不到图像,只是一个符号(带有斜线的圆圈,这个“不允许”的符号)。当我释放鼠标按钮时,什么也没发生。我还用“F12”检查了我使用的是IE9模式,没有兼容模式。
我真的不知道问题是什么。代码似乎没问题(适用于FF)。使用GWT-Images制作DnD有问题吗?有趣的是,“onDragStart()”方法正在被解雇。但是“拖累”还没有完成。
哦,我正在使用GWT devmode来测试它。这可能是个问题吗?
我想仅使用GWT来解决这个问题。或者我应该去使用另一个库,比如gwt-dnd?有没有人在IE9上使用普通 GWT DnD?我不敢相信我是第一个尝试的人: - (。
答案 0 :(得分:1)
所以,我尝试了很多东西,我遇到了一个解决方案。
问题似乎出现在“onDragOver()”方法中。正如我在原始问题中发布的那样,我有一个空方法实现:
this.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(final DragOverEvent event) {
}
});
因为这是我在很多页面中找到的。必须存在该方法,否则Drag n Drop将不起作用。但似乎对于IE我甚至需要阻止默认行为(或做其他事情。只是记录方法不是“某事”)。所以我添加了一个“event.preventDefault();”对方法,现在它的工作原理。
this.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(final DragOverEvent event) {
event.preventDefault();
}
});
奇怪的是,我无法在任何地方找到这些信息。希望对其他人有用8 - )。
答案 1 :(得分:1)
我使用GWT 2.6遇到了与IE9相同的问题,我发现在onDragStart中设置数据会使IE9关闭。所有其他浏览器工作正常。所以我最终做了以下事情:
this.addDragStartHandler(new DragStartHandler(){
@Override
public void onDragStart(DragStartEvent event) {
if(!isIE9()){
event.setData(RangeSliderControl.KEY, key); // This causes IE9 to not work
}
}}
);
当然我已将isIE9()方法添加到我的代码中,如下所示:
/**
* Gets the name of the used browser.
*/
public static boolean isIE9() {
return (getBrowserName().indexOf("msie 9.0") != -1);
};
/**
* Gets the name of the used browser.
*/
public static native String getBrowserName() /*-{
return navigator.userAgent.toLowerCase();
}-*/;