Javascript 如何防止onload始终运行?

Javascript 如何防止onload始终运行?,javascript,html,function,Javascript,Html,Function,我有一个功能,我想运行时,一个网站的主页是第一次加载。但是,如果我没有直接访问主页,而是因为点击了网站上的链接而直接访问主页,那么我不希望该功能运行。 为此,我将每个链接指向主页,并将其指向加载的home.html,而不是home.html。我还创建了下面的函数作为onload执行的函数: function onloadPreventer(fun) { if (window.location.hash != "#loaded") { //alert(window.loca

我有一个功能,我想运行时,一个网站的主页是第一次加载。但是,如果我没有直接访问主页,而是因为点击了网站上的链接而直接访问主页,那么我不希望该功能运行。
为此,我将每个链接指向主页,并将其指向加载的
home.html
,而不是
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;
    };
};
如果
home.html
之后没有加载
#
,则此函数应仅执行函数
fun
。但是,它总是执行
fun

然而,奇怪的是,它没有再次添加
#loaded

当我第一次进入
home.html
(没有散列)——如果我注释掉
alert
语句——它首先什么也不给我,然后给我
#loaded
,然后运行
fun
。一切尽其所能。
如果我从另一个页面转到
home
,我已经首先加载了
home.html。该页面不会发出任何警报,
onLoadPreventor
不会在当前位置的末尾添加另一个
#loaded
fun
仍会运行

通过
onload
事件,从
标记内部调用上述函数:

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

与下面的评论不同,
fun
确实在运行。我的问题是,即使页面加载了hash
#
,if
语句中的其余代码也不会运行,但
fun
仍然会运行

此代码有什么问题?

还有其他方法(可能更简单)来完成我想要完成的任务吗?

这在我的测试中有效:

我有两个基本页面:

<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>

var callWhenNoHash=函数(){
log('called');
};
window.onload=函数(){
if(window.location.hash!='#hash'){
callWhenNoHash();
}
};
以及:



一切正常。

这就像一个魅力:

您的问题就在这里:
onload=“onloadPreventer(另一个函数(arg))

“anotherFunction”正在运行,因为它后面有()


您可以使用
onload=“onload preventer(另一个功能)
,因为我们不再处于黑暗时代

您似乎对函数感到困惑:

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 */
然后,当且仅当使用括号时调用函数

(或者,您可以让浏览器为您调用函数,例如,让它们成为事件处理程序,或者使用
setTimeout
setInterval
延迟函数。在这些情况下,您不使用括号。)

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

function onloadPreventer(fun) {
    if (location.hash !== (location.hash = "#loaded")) {
        fun(); // DOES call fun
    }
}
但是
fun
必须是函数,而不是函数返回的值:

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

参数
fun
是函数吗?如果是,是否在其他地方呼叫?什么时候叫onloadPreventer?我想知道你在这里要求什么
1
客户端打开主页,
2
如果URI的散列未加载,请转到
#加载
3a
如果我们在
#加载
结束,
3b
如果我们没有在
#加载
结束,请注意
乐趣不调用该函数。您必须在其他地方有
fun()
,或者它可能是一个事件处理程序。@Oriol我知道
fun
不调用函数,除非我输入一个函数作为
onloadPreventer
函数的参数。您能再发布一些代码吗?例如,如何将onload事件连接到
onLoadPreventor
并传递参数
fun
,即使页面已加载
散列,此操作仍将运行
fun
。所以我还是有同样的问题。还有,在这里调用
onload
而不是从
内部调用
有什么特别的原因吗?没有特别的原因,我只是猜你在做什么。你能提供一个关于你的问题的示例页面吗?我真的不明白这个问题。这可能是浏览器的问题吗?”因为那个密码对我来说什么都没有?我正在使用Firefox。是的,我现在明白了。在您的第一个代码块中,最后一个示例解释了我的错误所在。代码正在执行第一个函数,第二个函数的返回值作为参数。
function onloadPreventer(fun) {
    if (location.hash !== (location.hash = "#loaded")) {
        fun(); // DOES call 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
    }
};