关于find方法的问题

来源:3-4 幻灯片的js--初始化、切换和绑定事件

10hours

2019-11-19 10:55:41

//slider.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>slider</title>
<link rel="stylesheet" href="../css/base.css">
<link rel="stylesheet" href="../css/common.css">
</head>
<style>
.slider{
position: relative;
overflow: hidden;
width: 728px;
height: 504px;
margin-left: 200px;
}
.slider-indicator-wrap{
position: absolute;
bottom: 24px;
left:50%;
margin-left: -36px;
display: block;
}
.slider-indicator{
margin: 0 6px;
display: inline-block;
height: 8px;
width: 8px;
border-radius: 50%;
border: 2px solid #e5e9eb;
background-color: #313a43;
}
.slider-indicator-active{
background-color: #f1f2f4;
border-color: #898f96;
}
.slider-control{
position: absolute;
top: 50%;
margin-top: -31px;
width: 28px;
height: 62px;
line-height: 62px;
background-color: #000;
opacity: 0.5;
filter:alpha(opacity=80);/*IE*/
color: #fff;
font-size: 20px;
font-family: simsun;
text-align: center;
}
.slider-control-left{
left: 0;
}
.slider-control-right{
right: 0;
}
.slider-item{
display: none;
}
.slider-fade .slider-item{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;

}
</style>
<body>
<div id='focus-slider' class="slider slider-fade">
<div class="slider-container">
<div class="slider-item">
<a href="#" target="_blank"><img src="../img/focus-slider/1.png" alt=""></a>
</div>
<div class="slider-item">
<a href="#" target="_blank"><img src="../img/focus-slider/2.png" alt=""></a>
</div>
<div class="slider-item">
<a href="#" target="_blank"><img src="../img/focus-slider/3.png" alt=""></a>
</div>
<div class="slider-item">
<a href="#" target="_blank"><img src="../img/focus-slider/4.png" alt=""></a>
</div>
</div>

<ol class="slider-indicator-wrap">
<a href="#" class="slider-indicator fl text-hidden">1</a>
<a href="#" class="slider-indicator slider-indicator-active fl text-hidden">2</a>
<a href="#" class="slider-indicator fl text-hidden">3</a>
<a href="#" class="slider-indicator fl text-hidden">4</a>
</ol>
<a href="###" class="slider-control slider-control-left">&lt;</a>
<a href="###" class="slider-control slider-control-right">&gt;</a>
</div>

<script type="text/javascript" src="../js/transition.js"></script>
<!-- <script type="text/javascript" src='../js/showHide.js'></script> -->
 
   <script type="text/javascript" src="../js/jquery.js"></script>
   <script type="text/javascript" src="../js/slider.js"></script>
   <script type="text/javascript">
         var $focusSlider = $('#focus-slider');

         $focusSlider.slider({
          css3:true,
          js:false,
          animation:'fade',
          activeIndex:2,
            Interval:800//800
         })

         
   </script>
</body>
</html>
//slider.js
(function($){
	'use strict';

	function Slider($elem,options){
		this.$elem=$elem;//根据this 调用栈 当前为全局作用域 供其他方法调用
		this.options=options;


		this.$items =this.$elem.find('.slider-item');
		this.$indicators=this.$elem.find('.slider-indicator');

		this._init();
	}
	Slider.DEFAULTS={
		css3:false,
		js:false,
		animation: 'fade',
		activeIndex :0,
		interval:0
	};
	Slider.prototype._init =function(){
		this.$items.eq(this.options.activeIndex).show();
		console.log(this.$indicators)
		this.$indicators.removeClass('slider-indicator-active');
		this.$indicators.eq(this.options.activeIndex).addClass('slider-indicator-active');
	}
	$.fn.extend({
			slider:function(option){//在html 传入的option有可能是对象object{} 也有可能是字符串'string'
				return this.each(function(){
					var $this=$(this),//存储变量 避免重复调用
					    slider=$this.data('slider'),//储存data数据 避免多次实例化影响性能
					    options = $.extend({},Slider.DEFAULTS,$this.data(),typeof option === 'object' 
						&& option)//判断传入的是不是对象 如果是就进行覆盖
					/*dropdown(this,options);*/

					if(!slider){ //判断是不是空的 如果是就实例化
						$this.data('dropdown',slider = new Slider(this,options))//xxx = new object 立即执行Dropdown)//use data to 存储dropdown 避免每次调用函数多次实例化
					}
					if (typeof slider[option] === 'function'){//判断是不是函数 是就执行 slider('show')
						slider[option]();// 因为传入option是字符串 所以用[option]
					}
				})
			}
		})
})(jQuery)

我照着老师的写居然会报这样的错误

我查了一下 写成this.$items =$(this.$elem).find('.slider-item');

用$()转换成Jquery对象就解决了问题 但是老师为什么不用这么写也不出错?

http://img.mukewang.com/climg/5dd358cb0916f09119100427.jpg

写回答

2回答

好帮手慕粉

2019-11-19

同学你好,首先很抱歉第一次没有找到同学的问题。

报错是因为同学在给Slider传对象的时候,没有将dom对象转为jq对象,参考下图:

http://img.mukewang.com/climg/5dd3d3a609578e0709920841.jpg

改正就好了。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

好帮手慕粉

2019-11-19

同学你好,老师测试了同学的代码,this.$elem.find是没有报错信息的:
http://img.mukewang.com/climg/5dd3886109bca33513690409.jpg

1、同学的会报错可能引入js文件的时候,浏览器解析产生了问题:

http://img.mukewang.com/climg/5dd388b209dc23c010470193.jpg

2、jquery.js应该放在所有js文件的前面,防止在使用时jquery.js还未加载进来。同学可以试一下,调整一下文件引入的顺序,参考:
http://img.mukewang.com/climg/5dd388f409a616ce08210147.jpg

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0
h0hours
h 我调整了顺序,关键是第五行!我得写成this.$elem=$($elem); 而不是像视频0′25″那样 this.$elem=$elem 不然就会报 find方法Undefined 麻烦老师再测试一下!
h019-11-19
共1条回复

0 学习 · 14456 问题

查看课程