Javascript 未捕获类型错误:无法读取属性';默认视图';没有定义的生命
我正在学习jQuery第四版(PacktPub publishing),尝试其中一个练习,其中我必须创建名为.slideFadeIn()和.slideFadeOut()的新插件方法,将.fadeIn()和.fadeOut()的不透明动画与 .slideDown()和.slideUp()的高度动画 这是我当前的代码Javascript 未捕获类型错误:无法读取属性';默认视图';没有定义的生命,javascript,jquery,Javascript,Jquery,我正在学习jQuery第四版(PacktPub publishing),尝试其中一个练习,其中我必须创建名为.slideFadeIn()和.slideFadeOut()的新插件方法,将.fadeIn()和.fadeOut()的不透明动画与 .slideDown()和.slideUp()的高度动画 这是我当前的代码 (function($) { $.fn.slides={ slideIn:function(){ $(this).fadeIn().slideDown();
(function($) {
$.fn.slides={
slideIn:function(){
$(this).fadeIn().slideDown();
},
slideOut:function(){
$(this).fadeOut().slideUp();
}
}
})(jQuery);
$('h1').click(function(){
$(this).slides.slideOut();
});
但是当我点击
时,我得到了错误信息
Uncaught TypeError: Cannot read property 'defaultView' of undefined
我也试过了
(function($) {
var elem=$(this);
$.fn.slides={
slideIn:function(){
elem.fadeIn().slideDown();
},
slideOut:function(){
elem.fadeOut().slideUp();
}
}
})(jQuery);
查看错误是否是因为$(this)
引用了不同的上下文,但我仍然收到相同的错误
Uncaught TypeError: Cannot read property 'defaultView' of undefined
编辑:我已尝试编辑代码以
$('h1').fadeOut().slideUp();
它是有效的,所以问题在于$(这个)
,我只是不知道$(这个)
有人能指出我的错误吗
谢谢 您创建插件的方式与我的略有不同,因为“this”是“fn.slides”的作用域“this”-因此,它会出错。我可以通过传递您想要的“this”的上下文来解决您的问题,即通过使用“call”来传递“h1”。使用“call”(和“apply”),我可以调用函数并在我想要的“this”上下文中传递
(function($) {
$.fn.slides={
slideIn:function(){
$(this).fadeIn().slideDown();
},
slideOut:function(){
$(this).fadeOut().slideUp();
}
}
})(jQuery);
$('h1').click(function(){
$(this).slides.slideOut.call(this);
});
在函数
slideIn
和slideOut
中,它看起来确实像this====$.fn.slides
,尝试使用console.log(this),看看它告诉了你什么。推理:当作为foo.bar(foo.bar
调用时,this===foo
)
Hi Paul,感谢您的回复,我尝试了console.log(this),它登录到console,h1元素。也就是Title,当我将console.log(this)放在函数中而不是单击处理程序中时,它返回对象{slideIn:function,slideOut:function};$(document.body).foo.bar();//对象{bar:function}你所说的**“this”是指“fn.slides”的作用域“this”**?我正在按照书中给出的示例创建插件,“如何创建插件?”我为不够简洁而道歉。当你调用slideOut(使用当前代码)时,slides的作用是$this-元素,但在方法“slideOut”中,$this指的是对象$.fn.slides.Console在该方法中的作用域。您将看到它转储了实际的slides对象。