问个JS的问题

BearRui 2008-06-24 10:18:04
我在JS文件中要注册1个window.onload事件,这样写:
页面:
<body onload="alert('1');">

我在JS文件中写:window.onload = function(){alert("2");}。

这样就只能弹出2,不能弹出1,我想弹出1后再弹出2。请问JS该怎么写。

注:body的onload事件是不可预知的,不知道会写什么代码。

谢谢。

...全文
326 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearRui 2008-06-25
  • 打赏
  • 举报
回复
window.onload = function(){f();f1();f2();.....}

这样就依顺序f()-->f1()-->f2()输出

不可能这样写,因为我不知道本来onclick事件中写的什么东西,不可预知
nfnxg123456 2008-06-24
  • 打赏
  • 举报
回复
这我到没有试。。。。你可以试试看。。。感觉上应该是没问题的。。。。
xuyiazl 2008-06-24
  • 打赏
  • 举报
回复
to:hackztx
你这样只会执行最后一个window.onload
BearRui 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nfnxg123456 的回复:]
写成这样试


<body onload="alert('1')">
<script>
new document.body.onload
window.onload = function(){alert("2");}
</script>

[/Quote]

请问下,new document.body.onload 表示什么意思。
其它的事件可否这样使用,比如button的onclick能不能这样用。
hackztx 2008-06-24
  • 打赏
  • 举报
回复
我在JS文件中要注册1个window.onload事件,这样写:
页面:
<body onload="alert('1');">

我在JS文件中写:window.onload = function(){alert("2");}。

这样就只能弹出2,不能弹出1,我想弹出1后再弹出2。请问JS该怎么写。

注:body的onload事件是不可预知的,不知道会写什么代码。

谢谢。

要知道不存在循环的情况下,代码是一行一行的处理的!!!
你可以这样写
<body onload="alert('1')">
然后调用js文件!!
selad 2008-06-24
  • 打赏
  • 举报
回复
我想重复一下楼主的问题
看看是不是理解正确

楼主是要写一个通用的js
然后引用
同时还要求<body onload="alert('1');"> 执行

我说的对不?
nfnxg123456 2008-06-24
  • 打赏
  • 举报
回复
我做过测试了。。行的。
不知道符不符合你的要求。
nfnxg123456 2008-06-24
  • 打赏
  • 举报
回复
写成这样试


<body onload="alert('1')">
<script>
new document.body.onload
window.onload = function(){alert("2");}
</script>
BearRui 2008-06-24
  • 打赏
  • 举报
回复
回楼上。好像你回了那么多,都是无关的?

并没有解决我的问题。
xuyiazl 2008-06-24
  • 打赏
  • 举报
回复
<scirpt src='楼主写的通用.js'></script>//内容window.onload=a;var a = function(){alert('1');}
<script>
//同事写的
window.onload = f;
var f = function(){
alert('2');
}
</script>

结果是2
xuyiazl 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 BearRui 的回复:]
情况是这样的:

我写的是1个通用的JS文件,是给部门所有项目使用的,而 <body onload事件是不可预知的,是别人写的。

所以没办法想你们那样加。
[/Quote]

在其body onlod中加载 然而js window.onload
在body onload中就不会被执行,如果存在多个onload只会执行后者
楼主在写公用js的同时 页面中所有onload都无法执行/
xuyiazl 2008-06-24
  • 打赏
  • 举报
回复
首先楼主需要了解Javascript在页面的执行顺序

页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记<script />的出现顺序, <script />标记里面的或者通过src引入的外部JS,都是按照其语句出现的顺序执行,而且执行过程是文档装载的一部分。
每个脚本定义的全局变量和函数,都可以被后面执行的脚本所调用。
变量的调用,必须是前面已经声明,否则获取的变量值是undefined。
<script type="text/javscrpt">//<![CDATA[
alert(tmp); //输出 undefined
var tmp = 1;
alert(tmp); //输出 1
//]]></script>

同一段脚本,函数定义可以出现在函数调用的后面,但是如果是分别在两段代码,且函数调用在第一段代码中,则会报函数未定义错误。
<script type="text/javscrpt">//<![CDATA[
aa(); //浏览器报错
//]]></script>
<script type="text/javscrpt">//<![CDATA[
aa(); //输出 1
function aa(){alert(1);}
//]]></script>



document.write()会把输出写入到脚本文档所在的位置,浏览器解析完documemt.write()所在文档内容后,继续解析document.write()输出的内容,然后在继续解析HTML文档。

<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\\/script>');
document.write('<script type="text/javascript">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>

test.js的内容是:

var tmpStr = 1;
alert(tmpStr);在Firefox和Opera中的弹出值的顺序是:1、2、我是1、3
在IE中弹出值的顺序是:2、1、3,同时浏览器报错:tmpStr未定义
原因可能是IE在document.write时,并未等待加载SRC中的Javascript代码完毕后,才执行下一行,所以导致2先弹出,并且执行到document.write(’document.write("我是" + tmpStr)’)调用tmpStr时,tmpStr并未定义,从而报错。

解决这个问题,可以利用HTML解析是解析完一个HTML标签,再执行下一个的原理,把代码拆分来实现:

<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>

这样IE下和其他浏览器输出值的顺序都是一直的了:1、2、我是1、3。




如何改变Javascript在页面的执行顺序

利用onload
<script type="text/javascript">//<![CDATA[
window.onload = f;
function f(){alert(1);}
alert(2);
//]]></script>

输出值顺序是 2、1。

需要注意的是,如果存在多个winodws.onload的话,只有最有一个生效,解决这个办法是:

window.onload = function(){f();f1();f2();.....}

利用2级DOM事件类型

if(document.addEventListener){
window.addEventListener('load',f,false);
window.addEventListener('load',f1,false);
...
}else{
window.attachEvent('onload',f);
window.attachEvent('onload',f1);
...
}


IE中可以利用defer,defer作用是把代码加载下来,并不立即执行,等文档装载完毕之后再执行,有点类似window.onload,但是没有window.onload那样的局限性,可以重复使用,但是只在IE中有效,所以上面的例子可以修改成为
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\\/script>');
document.write('<script type="text/javascript" defer="defer">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>

这样IE就不报错了,输出值的顺序变成:1、3、2、我是1

当HTML解析器遇到一个脚本,它必须按常规终止对文档的解析并等待脚本执行。为了解决这个问题HTML4标准定义了defer。通过defer来提示浏览器可以继续解析HTML文档,并延迟执行脚本。这种延迟在脚本从外部文件载入时非常有用,让浏览器不必等待外部文件全部载入之后才继续执行,能有效的提高性能。IE是目前唯一支持defer属性的浏览器,但IE并没有正确的实现了defer属性,因为延迟的脚本总是被延迟,直到文档结束,而不是只延迟到下一个非延迟的脚本。这意味着,IE中延迟的脚本的执行顺序相当混乱,并且不能定义任何后面非延迟脚本并须的函数和变量。在IE中所有的defer的脚本执行时间应该都是HTML文档树建立以后,window.onload之前。

利用Ajax。
因为xmlhttpRequest能判断外部文档加载的状态,所以能够改变代码的加载顺序。
cheng_feng001 2008-06-24
  • 打赏
  • 举报
回复
<body onload="alert('1');">是在document.body.onload时执行,晚于window.onload
wzy_love_sly 2008-06-24
  • 打赏
  • 举报
回复
一加二不行,找一个类似onload的事件加,效果相同就可以了吧...
BearRui 2008-06-24
  • 打赏
  • 举报
回复
情况是这样的:

我写的是1个通用的JS文件,是给部门所有项目使用的,而<body onload事件是不可预知的,是别人写的。

所以没办法想你们那样加。
牛人 2008-06-24
  • 打赏
  • 举报
回复
<body onload="alert('1');">

window.onload 就是body onload事件
牛人 2008-06-24
  • 打赏
  • 举报
回复

window.onload = function(){alert("1");alert("2")}。
chengqscjh 2008-06-24
  • 打赏
  • 举报
回复
<script>
window.onload=function(参数)
{
if参数1
alert1();
else
alert2();
}
function alert1(){alert("1");}
function alert2(){alert("2");}
</script>
这样可否
  • 打赏
  • 举报
回复
楼上说的我觉得可以
maddemon 2008-06-24
  • 打赏
  • 举报
回复
假如你的<body onload>不能写在js中的话 那就把 你的js的window.onload写过来了 比如
<script>
window.onload=function(){alert1();alert2();}
function alert1(){alert("1");}
function alert2(){alert("2");}
</script>
加载更多回复(27)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧