2012-02-26 39 views
1

我有以下的代码和第二onload事件在不触发:二的onload功能不起作用

<script type="text/javascript"> 
    var startime = (new Date()).getTime(); 

    window.onload = function(){ record_visit('ol'); } //ol - onload 
    window.onload = function(){ setInterval("upState()", 30000); } 
    window.onbeforeunload = function(){ record_visit('obul'); } //obul = onbeforeunload 

    function record_visit(value) { 
     var x = (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); 
     x.open("GET", "count_visit.php?t=" + (((new Date()).getTime() - startime)/1000)+"&type="+value+"&url="+escape(window.location.href), false); 
     x.send(null); 
    } 

    function upState() 
    { 
     // create the AJAX variable 
     var xmlhttp; 
     if (window.XMLHttpRequest) 
      xmlhttp = new XMLHttpRequest(); 
     else 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

     // make the AJAX call 
     xmlhttp.open("GET", "count_visit.php?t=" + (((new Date()).getTime() - startime)/1000)+"&type=update&url="+escape(window.location.href), false); 
     x.send(null); 
    } 
</script> 

所有我需要的是在这里使用count_visit.php发送请求和更新表的访问者是仍然在线。

我试了一些代码,我发现在一些网站,但仍然没有射击。这里的代码:

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
    window.onload = func; 
    } else { 
    window.onload = function() { 
     if (oldonload) { 
     oldonload(); 
     } 
     func(); 
    } 
    } 
} 
addLoadEvent(record_visit('ol')); 
addLoadEvent(setInterval("upState()", 30000)); 

请任何帮助。

+0

它永远不会火在你使用它的方式 - 第二个'window.onload'你覆盖之前定义的那个。 – Cheery 2012-02-26 07:50:24

回答

3

随着第二个window.onload你覆盖了之前定义的那个。当你不使用jQuery(这使这些东西更容易)使用下面的函数

function myEvent(where,evt,func,op) 
{ 
if (op) 
    { 
    if (where.attachEvent) where.attachEvent("on"+evt,func); 
    else if (where.addEventListener) where.addEventListener(evt,func,false) 
    } 
    else 
    { 
    if (where.detachEvent) where.detachEvent("on"+evt,func); 
    else if (where.removeEventListener) where.removeEventListener(evt,func,false); 
    } 
} 

where - 对象在其中添加事件侦听到

evt - 事件的名称(不带“上“部分)

func - 函数的调用事件

op - 如果它被设置为true函数就会将监听器nd如果它设置为false该函数将删除侦听器。

将其称为myEvent(window, 'load', func, true);无论您添加了多少功能 - 所有这些功能都将在给定事件中调用。

PS:或者你可以使用这种方法,你必须检查以前的事件处理程序的存在人工结合的两种职能的内容:))

window.onload = function(){ 
     record_visit('ol'); 
     setInterval(upState, 30000); 
} 

,将其保存在一些全局变量和呼叫它会在稍后时候处理执行最后的和唯一的一个window.onload函数。您正在尝试在代码的最后部分执行此操作。

+0

另外,避免'setInterval(“runCode()”,1000)',因为第一个字符串(参数)使用'eval()'运行,这很慢,可能很危险,并且可能会有意想不到的结果。使用一个匿名函数:'setInterval(function(){upState()},30000);'。 'setTimeout()'也一样。 – 2012-02-26 08:06:20

+0

@JaredFarrish我刚刚复制了OP的变体:)个人我会写它为'setInterval(upState,30000);'感谢您的评论。 – Cheery 2012-02-26 08:10:30

2

如果你希望两个功能火上的window.onload,你可以做这样的:

function onload1(){ 
    alert("onload1"); 
} 
function onload2(){ 
    alert("onload2"); 
} 
window.onload = function() { 
    onload1(); 
    onload2(); 
}