为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
Why eventhandler function in document.ready works but doesn't work when taken out?
我是Javascript的新手,我想知道下面的行为。
考虑下面的工作代码:
<div><br/><strong>Click Me!</strong></div>
<script>
$(document).ready(function(){
$('div').mouseenter(function(){
$(this).fadeTo('fast',1);
});
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
});
</script>
但这个不起作用:
<div onmouseover="fade()"><br/><strong>Click Me!</strong></div>
<script>
$(document).ready(function(){
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
});
function fade(){
$(this).fadeTo('fast',1);
}
</script>
当我只使用内联事件处理程序和函数时,为什么第二个不起作用?
提前感谢!
首先,我不会这么做。从使用现代事件处理切换到onXyz
属性有点落后。请参阅下面的折叠以了解更多信息。
但是,回答为什么它不起作用的问题:在第二个示例中,对fade
的调用中的this
不是div(它是全局对象,在浏览器上也称为window
)。您必须将onmouseover
更改为:
onmouseover="fade.call(this)"
使this
在调用期间成为div。
(另外,请注意,您在第二个代码块中使用了onmouseover
,但在第一个代码块使用了mouseenter
。我将其保留为onmouseover
,但您可能想要onmouseneter
。)
示例:
$(document).ready(function(){
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
});
function fade(){
$(this).fadeTo('fast',1);
}
<div onmouseover="fade.call(this)"><br/><strong>Click Me!</strong></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
或者,只需将this
作为参数传入,然后更改fade
以使用它:
$(document).ready(function(){
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
});
function fade(element){
$(element).fadeTo('fast',1);
}
<div onmouseover="fade(this)"><br/><strong>Click Me!</strong></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
但是,我不会使用onXyz
属性;如果不希望在ready
回调中使用处理程序,则不需要它们,但这并不意味着必须切换到使用属性进行事件连接。相反:
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
$('div').mouseenter(function(){
$(this).fadeTo('fast',1);
});
示例:
$('div').mouseleave(function(){
$(this).fadeTo('fast',0.5);
});
$('div').mouseenter(function(){
$(this).fadeTo('fast',1);
});
<div><br/><strong>Click Me!</strong></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
使用document.ready
是因为您不知道要影响的节点是否已经渲染。
脚本在页面上按顺序执行。因此,如果您的脚本定义下面有更多的div
,它们将不会在$("div")
中匹配。
由于脚本通常包含在头中,因此如果您希望JavaScript最初查看所有节点,则完全需要document.ready
。
在您的示例中,您本身不需要document.ready
。错误在其他地方。
<div>1</div>
<script>
console.log($("div").length); // 1
$(document).ready(function () {
console.log($("div").length); // 2
});
</script>
<div>2</div>
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 监视函数从服务返回不起作用,但作用域函数起作用
- 幻灯片滚动javascript不起作用
- 简单的javascript在Shopify中不起作用
- Recaptcha在IE7和IE8中不起作用
- Ember Data DS.Model's set函数不起作用
- JsFiddle上的鼠标事件不起作用
- 我的AngularJS表达式没有'不起作用
- 点击按钮输入不起作用
- 面向对象的Javascript代码在IE7中不起作用
- 分部隐藏在jquery中不起作用
- 在phonegap应用程序内部重定向不起作用
- Array.length似乎不起作用;console.log则显示其他情况
- $ionicplatform内的$scope不;不起作用
- 我的javascript for循环不起作用
- Meteor-添加用户自定义字段的方法不起作用
- 为什么 .focus() 不起作用,而 .css(“color”,“red”) 在同一个选择器上起作用
- 为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
- API请求不起作用——“;无效的IP”;
- AngularJs$无效;在这种情况下不起作用