如何防止onload一直运行?

时间:2014-04-16 12:41:55

标签: javascript html function

我想在首次加载网站主页时运行一个功能。但是,我不希望该功能运行,如果我没有直接访问主页,而是直接访问主页,因为我点击了指向我的网站上的链接。 为此,我将引导您访问主页的所有链接指向home.html#loaded,而不是home.html。我还创建了下面的函数作为onload执行的函数:

function onloadPreventer(fun) {
    if (window.location.hash != "#loaded") {
        //alert(window.location.hash);
        window.location = window.location + "#loaded";
        //alert(window.location.hash);
        fun;
    };
};

如果fun之后没有#loaded,此函数应该只执行函数home.html。但是,它始终执行fun 但是,奇怪的是它不会再次添加#loaded

当我第一次去home.html(没有哈希)时 - 如果我注释掉alert语句 - 它首先给我什么,然后给我#loaded然后运行fun。一切尽在其中。
如果我从其他页面转到home,我已经开始加载home.html#loaded。该页面不提醒任何内容,onloadPreventer不会在当前位置的末尾添加其他#loadedfun仍在运行

<body>标记内部通过onload事件调用上述函数:

<body onload="onloadPreventer(anotherFunction(arg))">

与以下评论不同,fun 运行。我的问题是,即使页面具有哈希#loadedif语句中的其余代码也不会运行,但fun仍然会运行。

此代码有什么问题?
还有另一种方法(可能更简单)来完成我想要完成的任务吗?

3 个答案:

答案 0 :(得分:2)

您似乎对功能感到困惑:

function foo(){ /* ... */ } /* does NOT call foo */
function bar(){ /* ... */ } /* does NOT call bar */
foo;                        /* does NOT call foo */
foo(arg);         /* DOES call foo with arg as argument  */
foo(bar);         /* does NOT call bar, and DOES call foo with bar as argument */
foo(bar(arg));    /* DOES call bar with argument arg, and DOES call foo
                     with the returned value of bar as argument */

然后,当您使用括号时,您正在调用函数。

(或者,您可以让浏览器为您调用函数,例如使用setTimeoutsetInterval制作事件处理程序或延迟函数。在这种情况下,您不使用括号。)< / p>

在您的情况下,您可以使用

function onloadPreventer(fun) {
    if (location.hash !== (location.hash = "#loaded")) {
        fun(); // DOES call fun
    }
}

但是fun必须是函数,而不是函数返回的值:

<body onload="onloadPreventer(
     function(){anotherFunction(arg);} /* does NOT call anotherFunction */
)">

但是更好地将内容与内容区分开来:

function fun() {
    anotherFunction(arg);
}
document.body.onload = function onloadPreventer() {
    if (location.hash !== (location.hash = "#loaded")) {
        fun(); // DOES call fun
    }
};

答案 1 :(得分:1)

这适用于我的测试:

我有两个基本页面:

<html><head>
<script type="text/javascript">
var callWhenNoHash = function() {
    console.log('called');
};
window.onload = function() {
    if (window.location.hash != '#hash') {
        callWhenNoHash();
    }
};
</script></head>
<body><a href="test2.html">test2</a></body>
</html>

<html><head></head><body>
<a href="test1.html#hash">test2</a>
</body></html>

一切都按预期工作。

答案 2 :(得分:1)

这就像一个魅力:

DEMO

$(window).load(function(){
  var load = "#loaded";
  if (window.location.hash != load) {
    window.location = window.location + load;
    document.write(load);
  };
})

您的问题出在此处:onload="onloadPreventer(anotherFunction(arg))

&#34;另一个功能&#34;正在运行,因为它之后的()。

您可以使用onload="onloadPreventer(anotherFunction)或使用 event listeners ,因为我们不再处于黑暗时代!