Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待在JSNI GWT中加载DOM_Javascript_Gwt_Dom_Jsni - Fatal编程技术网

Javascript 等待在JSNI GWT中加载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

我目前遇到一个问题,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, 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的完成情况。在你发帖前几分钟,我就得到了这个精确的解决方案,但无论如何,这是一条路要走!