Javascript 等待在JSNI GWT中加载DOM
我目前遇到一个问题,javascript似乎是在DOM完全加载之前执行的。我为什么这么说?以下面的代码为例:Javascript 等待在JSNI GWT中加载DOM,javascript,gwt,dom,jsni,Javascript,Gwt,Dom,Jsni,我目前遇到一个问题,javascript似乎是在DOM完全加载之前执行的。我为什么这么说?以下面的代码为例: var $r = $wnd.Raphael("container", 640, 480); // Creates pie chart at with center at 320, 200, // radius 100 and data: [55, 20, 13, 32, 5, 1, 2] $r.piechart(320, 240, 100, [ 55, 20, 13, 32, 5, 1
var $r = $wnd.Raphael("container", 640, 480);
// Creates pie chart at with center at 320, 200,
// radius 100 and data: [55, 20, 13, 32, 5, 1, 2]
$r.piechart(320, 240, 100, [ 55, 20, 13, 32, 5, 1, 2 ]);
返回Javascript异常:“f为null”。这似乎表明容器名称无法识别
如果指定绝对坐标,则piechart渲染良好。如果我在Chrome控制台中使用前面的代码(加载所有代码之后),它会有效地将piechart加载到容器标记中
我已尝试在JQuery调用中包装代码块:
$wnd.jQuery(function($) {
// Creates canvas 640 × 480 at 10, 50
var $r = $wnd.Raphael("container", 640, 480);
// Creates pie chart at with center at 320, 200,
// radius 100 and data: [55, 20, 13, 32, 5, 1, 2]
$r.piechart(320, 240, 100, [ 55, 20, 13, 32, 5, 1, 2 ]);
});
。。。没有骰子
我能试试什么吗
编辑:
下面是我调用JSNI方法的方式/位置。以下是相关的视图代码
public class WidgetSamplerView extends AbstractPanelView implements
WidgetSamplerPresenter.Display {
private FlexTable mainPanel;
public WidgetSamplerView() {
super();
mainPanel = new FlexTable();
HTML container = new HTML();
container.getElement().setAttribute("style",
"width:700px;height:700px");
container.getElement().setId("container");
mainPanel.setWidget(0, 1, container);
MyRaphaelWrapper.pieChart(); // JSNI Call
setWidget(mainPanel);
}
}
我怀疑拉斐尔在内部做了以下工作:
document.getElementById("container");
如果使用标准设置编译GWT应用程序,则代码将加载到iframe中。这就是为什么必须使用$wnd而不是window,使用$doc而不是document。他们指向主窗口
您是如何包含其他javascript库的?因为拉斐尔可能在看错误的DOM(iframe的DOM)。你能用这样的东西把元素直接传递给rapahel吗
var c = $doc.getElementById("container");
$wnd.Raphael(c, ..);
您必须确保仅在激活
onLoad()
时调用JSNI方法,以验证小部件是否已加载
请参阅,以获取快速参考
基本思想是覆盖小部件上的onLoad()
,并在那里调用任何加载功能:
公共类主面板扩展FlexTable{
私有元素容器;
公共主面板(){
container=DOM.createDiv();
container.setId(“container”);
//这是小部件API定义底层元素所必需的
setElement(容器);
}
@凌驾
受保护的void onLoad(){
super.onLoad();
MyRaphaelWrapper.pieChart();//JSNI调用
}
}
}
只是猜测:也许拉斐尔试着看错了DOM?我会尝试$wnd.Raphael($doc.getElementById(“容器”),640480);我们需要看到更多的上下文代码,比如JSNI调用。您是否在适当的阶段调用JSNI包装方法(onLoad
,onAttach
,onRender
等)?@StefanHaustein没有骰子,它返回“f为null”。无论如何,谢谢您的评论。@EliranMalka在向应用程序的主容器面板添加了一堆其他小部件之后,我只是在演示者中静态地调用它。请同时附上演示者代码,这将为我们(和您)提供更多线索。“f为空”。不过,感谢您的评论:)我依靠JQuery来检查DOM的完成情况。在你发帖前几分钟,我就得到了这个精确的解决方案,但无论如何,这是一条路要走!