【问题标题】:why onload event not working?为什么 onload 事件不起作用?
【发布时间】:2015-07-20 18:19:15
【问题描述】:

这是我的代码:

$('.classname').on('click',function myfunc() {
  alert ('working ..!');
});

上面的代码工作正常,当我点击 div .classname 时,它给了我一条消息:working ..!

现在我想将该函数 (myfunc) 用于 onload 事件。这是我的尝试:

window.onload = myfunc;
window.onload = myfunc();
document.onload = myfunc();
<body onload = "myfunc()">
object.onload=myfunc(){alert ('working ..!');}

但它们都不起作用。为什么 ?!为什么,当我刷新页面时没有看到任何消息?我该如何解决?

【问题讨论】:

  • 你定义myFunc方法了吗?
  • 因为 myfunc 是在 on() 调用中声明的。你需要在外面声明它,所以它的作用域是全局的。
  • @Sushanth——是的。看看我的第一个代码。 function myfunc() { alert ('working ..!'); });
  • @Sajad 。但看起来那是一个匿名函数,它是事件处理程序。将其移出并在其外部声明一个函数。

标签: javascript jquery onload


【解决方案1】:
$('.classname').on('click',function myfunc() {
  alert ('working ..!');
});

您已经使用函数表达式创建了一个命名函数。您已将其传递给on()

因为它是一个函数表达式,所以您没有在当前范围内创建一个名为myfunc 的变量。它只能从自身内部以及on 函数内部访问。

改用函数声明。

function myfunc() {
  alert ('working ..!');
}
$('.classname').on('click', myfunc);
$(document).on('load', myfunc);

关于function declarations and expressions 的进一步阅读可以在 MDN 上找到。

【讨论】:

  • 您的示例运行正常。但实际上不适用于我的代码。请查看我的更新...
  • @Sajad — 为什么文档的加载事件会有(this).attr("href")?这不是一个链接。这是一份文件。
  • 哇!!!!我懂了。这就是问题所在,好吧,我怎样才能得到 url 的结尾?这是我的网址:www.example.com/contact#test,现在我需要test,我该如何获取?
  • the location object.阅读它
  • 我仍然无法获得test!我应该使用url.hash 吗?
【解决方案2】:

函数的作用域不是全局的,所以你需要在点击事件之外声明它。

【讨论】:

  • 我该如何解决?
  • 关于范围:它不需要是全局的,但它确实需要比在 'click' 事件处理程序中定义时更广泛的范围。
【解决方案3】:

使用ready 事件而不是加载呢?正如您在 jquery 文档中所读到的那样:

.load() 将事件处理程序绑定到“加载”JavaScript 事件。

.ready() 指定在 DOM 完全加载时执行的函数。

在我看来,完整的 dom 应该被完全加载(即,已经为滚动设置和计算的元素大小......)

function scroll() {
    alert('test');
     return false;
}

$('.link').on('click', scroll);
$(document).on('ready', scroll);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="link">manual test</a>

编辑 回答初始帖子。小心,我看到你在 prop 键和值 &lt;body onload = "myfunc()"&gt; 之间放置了空格,你不能这样做。应该是key=value

var myfunc = function() {
  alert ('working ..!');
}
<body onload="myfunc()">
  <a onclick="myfunc()">manual test</a>
</body>

【讨论】:

  • 嘿嘿! thx :) 也许您可以为其他用户“验证”答案;)
  • 我认为您正在寻找“接受”一词,并且由于它不能解决问题(原始问题或编辑中添加的额外问题),因此不应接受。
  • @Quentin ready 似乎在等待所有下载和绘画/渲染触发事件......more info in jquery doc
  • 嗯。它等待依赖。关键是,如果您正在等待某事,那么loadready 更有可能等待足够长的时间。由于 OP 试图滚动到文档中的特定点,希望使用 load 而不是 ready,以便可以加载图像并重排文档以适应它们。切换到ready 可能会引入其他问题。
  • 我明白你的意思,但奇怪的是,load 不会在测试中触发。也许我们应该将listner附加到window而不是body,就像在jquery recommandation中一样