在这种情况下使用onclick事件处理程序可以接受吗
Is it acceptable to use the onclick event handler in this case?
我有一个带子菜单的简单导航菜单。当在同一页面上单击子菜单中的链接时,窗口会使用jQuery滚动到相应的锚点。
以下是子菜单列表项的示例:
<li><a href="page.html#some-anchor" onclick="clickScroll('#some-anchor');"><span>foo</span></a></li>
相应的锚点如下所示:
<a class="hidden-anchor" id="some-anchor" name="some-anchor"></a>
JavaScript函数:
function clickScroll(dest) {
$('html, body').stop().animate({
scrollTop: $(dest).offset().top
}, 1000);
}
这一切都很好,但和我之前的许多人一样,我一直在读到内联事件处理程序这些天是不好的做法。
如何修改函数以消除对任何onclick
调用的需要?请记住,每个子菜单链接都对应于不同的锚点。
假设您希望具有哈希#
的所有锚都滚动到具有相同ID的相应锚,则可以循环浏览所有锚,解析出哈希并滚动到相同ID:
$('a').each(function() {
if ( this.hash ) {
$(this).click(function(e) {
$('html,body').animate({ scrollTop: $(this.hash).offset().top }, 1000);
e.preventDefault();
});
}
});
http://jsfiddle.net/nGfW5/
如果您想将此功能限制为某些锚点,请添加一个类并将其插入选择器中,例如$('a.hashlink').each(
使用事件处理程序:http://api.jquery.com/on/
<li><a id="some-scroll-source" href="page.html#some-anchor"><span>foo</span></a></li>
<a class="hidden-anchor" id="some-anchor" name="some-anchor"></a>
(function () {
function clickScroll() {
var dest = $('#' + ($(this).attr('href').split('#')[1]));
$('html, body').stop().animate({
scrollTop: $(dest).offset().top
}, 1000);
}
$('#some-scroll-source').on('click', clickScroll);;
}());
试试这个:
$('li a').each (function () {
$(this).click(function () {
$('html, body').stop().animate({
scrollTop: $(this.hash).offset().top
}, 1000);
});
});
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default