Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
body.onload和GWT onModuleLoad启动顺序_Gwt_Onload_Bootstrapping - Fatal编程技术网

body.onload和GWT onModuleLoad启动顺序

body.onload和GWT onModuleLoad启动顺序,gwt,onload,bootstrapping,Gwt,Onload,Bootstrapping,根据,当GWT引导时,onModuleLoad被支持在HTML主体的onload事件之前运行。该常见问题解答中详述的流程如下: 1. The HTML document is fetched and parsing begins. ... 9. externalScriptOne.js completes. The document is ready, so onModuleLoad() fires. ... 12. body.onload() fires, in this case showi

根据,当GWT引导时,onModuleLoad被支持在HTML主体的onload事件之前运行。该常见问题解答中详述的流程如下:

1. The HTML document is fetched and parsing begins.
...
9. externalScriptOne.js completes. The document is ready, so onModuleLoad() fires.
...
12. body.onload() fires, in this case showing an alert() box.
但是在我的测试中,我检查了它是否以这种方式工作。或者至少不是在每一个浏览器中(奇怪的是,Google Chrome特别不坚持这种行为)。例如,我有一个涉及onModuleLoad和body.onLoad的小测试:

public void onModuleLoad() {

    runTestFunction();

}

private native void runTestFunction() /*-{
    console.log("GWT's onModuleLoad");
    $wnd.loaded=true;
}-*/;
以及:

但在Chrome中:

body.onLoad
Uncaught ReferenceError: loaded is not defined
GWT's onModuleLoad
在后者中,onModuleLoad运行最后一个,因此“loaded”var还不可用,body.onLoad代码不能使用它

我想要实现什么?我想要一些在body.onload中运行的手写Javascript与我的GWT代码交互。在本例中,我使用了这个虚拟的“加载”变量,但将来它应该能够调用用Java编写的GWT函数。问题是,我需要确保onModuleLoad首先运行,这样它就可以导出变量和方法供javascript访问

那么,我错过了什么?这种行为像看上去那样不可靠,还是我做错了什么


PS:我有一个计划B来实现这一点,它被证明是有效的,但首先我想确保不可能这样做,因为这应该是首选方法。

首先,文档的最新版本在

它还说(甚至是您正在查看的GWT1.5版本)“在解析外部文档后的任何时候都可以调用onModuleLoad()”,其中包括
window.onload前后的调用

正如文档所说,GWT将代码加载到iframe中(这里用作沙盒),这是异步的;因此,当iframe和“body”都被加载时,代码就会被加载。根据加载iframe所需的时间,可以是在
window.onload
之前或之后(在本例中,他们假设它会立即加载,当
*.cache.*
文件有效地位于浏览器的缓存中时可能会出现这种情况)


但经验法则是GWT努力(至少内置链接器)使事情异步启动,这样就不会中断其他外部资源(例如样式表和图像)的加载。这意味着不能保证在
window.onload
之前运行(他们可以保证在
window.onload
之后运行,但为什么要等待?

因此,在onModuleLoad中导出GWT方法和变量是不可靠的,是吗?那么你会把出口商放在哪里呢?换句话说,您如何确保某些手写JS仅在导出已经发生时才运行?让您的GWT模块在导出完成时调用全局函数;或多或少像(m)任何脚本注入器。请参阅,这是一个很好的示例(用于使用注释将GWT代码导出到JavaScript)。
GWT's onModuleLoad
body.onLoad
loaded var is set
body.onLoad
Uncaught ReferenceError: loaded is not defined
GWT's onModuleLoad