我想在首次加载网站主页时运行一个功能。但是,我不希望该功能运行,如果我没有直接访问主页,而是直接访问主页,因为我点击了指向我的网站上的链接。
为此,我将引导您访问主页的所有链接指向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
不会在当前位置的末尾添加其他#loaded
,但fun
仍在运行。
从<body>
标记内部通过onload
事件调用上述函数:
<body onload="onloadPreventer(anotherFunction(arg))">
与以下评论不同,fun
运行。我的问题是,即使页面具有哈希#loaded
,if
语句中的其余代码也不会运行,但fun
仍然会运行。
此代码有什么问题?
还有另一种方法(可能更简单)来完成我想要完成的任务吗?
答案 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 */
然后,当您使用括号时,您正在调用函数。
(或者,您可以让浏览器为您调用函数,例如使用setTimeout
或setInterval
制作事件处理程序或延迟函数。在这种情况下,您不使用括号。)< / 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)
这就像一个魅力:
$(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 ,因为我们不再处于黑暗时代!