老师,抱错了,找不到原因

老师,抱错了,找不到原因

http://img1.sycdn.imooc.com//climg/5dff318909f5918606500262.jpg

//index.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>项目:ES6实现图片切换特效</title>

</head>

<body>

<div id="wrap">

<!-- <div class="_Img_container">

<ul class="_Img_classify">

<li class="_Img_classify_type-btn _Img_type-btn-active">类别1</li>

<li class="_Img_classify_type-btn">类别2</li>

</ul>

<div class="_Img_img-container">

<figure>

<img src="" alt="">

<figcaption>title</figcaption>

</figure>

</div>

</div> -->

</div>

<!-- 遮罩层 -->

<!-- <div class="_Img_overlay">

<div class="_Img_overlay-prev-btn"></div>

<div class="_Img_overlay-next-btn"></div>

<img src="" alt="">

</div> -->

<script type="text/javascript" src="js/data.js"></script>

<script type="text/javascript" src="js/index.js"></script>

<script type="text/javascript">

const img = new $Img({

data,

initType: 'JavaScript',

parasitifer: '#wrap'

})


</script>

</body>

</html>

//index.js

(function(window,document){

//公共方法

const methods = {

//剩余参数...children把children转成一个数组

appendChild(parent, ...children){

children.forEach(el => {

parent.appendChild(el)

})

},

$(selector, root = document){

return root.querySelector(selector);

},

$$(selector, root = document){

return root.querySelectorAll(selector);

}

}


//构造函数Img的配置项options

//构造函数的this指向的是实例化对象

let Img = function(options){

//初始化一些变量以及对图片进行分类

this._init(options);

//生成dom元素

this._createElement();

//绑定事件

this._bind();

//显示到页面上

this._show();

};

Img.prototype._init = function({data, initType, parasitifer}){

this.types = ['全部']; //所有的分类

this.all = []; //所有图片元素

this.classified = {'全部': []}; //按照类型分类后的图片

this.curType = initType; //当前显示的图片分类

this.parasitifer = methods.$(parasitifer); //挂载点

this.imgContainer = null; //所有图片的容器

this.wrap = null; //整体容器

this.typeBtnEles = null; //所有分类按钮组成的数组

this.figures = null; //所有当前显示的图片组成的数组


this._classify(data); //图片的分类

};

Img.prototype._classify = function(data){

let srcs = []; //已经添加到分类中的图片的src数组

data.forEach(({title, type, src, alt}) => {

if(!this.types.includes(type)){

this.types.push(type);

};

if(!Object.keys(this.classified).includes(type)){

this.classified[type] = [];

};

if(!srcs.includes(src)){

//图片没有生成过

//生成图片

//添加到对应的分类中

srcs.push(src);

let figure = document.createElement('figure');

let img = document.createElement('img');

let figcaption = document.createElement('figcaption');


img.src = src;

img.setAttribute('alt', alt);

figcaption.innerText = title;

methods.appendChild(figure, img, figcaption);


this.all.push(figure);

this.classified[type].push(this.all.length - 1);

}else{

//去all中找到对应的图片

//添加到对应的分类中

this.classified[type].push(srcs.findIndex(s1 => s1 === src));

}

})

};

//根据分类获取图片

Img.prototype._getImgsByType = function(type){

return type === '全部' ? [...this.all] : this.classified[type].map(index => this.all[index]);

};

//生成DOM

Img.prototype._createElement = function(){

let typesBtn = [];//创建分类按钮

for (let type of this.types.values()){

typesBtn.push(`<li class="_Img_classify_type-btn${type === this.curType ? ' _Img_type-btn-active' : ''}">${type}</li>`)

};

console.log(typesBtn);

//整体的模板

let template = `

<ul class="_Img_classify">

${typesBtn.join('')}

</ul>

<div class="_Img_img-container"></div>

`;

let wrap = document.createElement('div');

wrap.className = '_Img_container';

wrap.innerHTML = template;

this.imgContainer = methods.$('_Img_img-container', wrap);

methods.appendChild(this.imgContainer, ...this._getImgsByType(this.curType));

this.wrap = wrap;

this.typeBtnEles = methods.$$('._Img_classify_type-btn', wrap);

this.figures = methods.$$('figure',wrap);


//遮罩层

let overlay = document.createElement('div');

overlay.className = '_Img_overlay';

overlay.innerHTML = `

<div class="_Img_overlay-prev-btn"></div>

<div class="_Img_overlay-next-btn"></div>

<img src="" alt="">

`;

methods.appendChild(this.wrap, overlay);

this.overlay = overlay;

this.previewImg = methods.$('img', overlay);

};

Img.prototype._bind = function(){


};

Img.prototype._show = function(){


};


window.$Img = Img;

})(window, document);


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,上条回答中,圈出来的位置是老师在调试的过程中做了调整的地方以及同学代码写错的地方,老师没有标注清楚,是老师的问题(反省中~)。关于粘贴的代码有双引号的问题,可能是老师将同学的代码粘贴到编辑器里引号丢失了,也希望同学下次粘贴代码的时候可以选择一下格式,就可以避免这种情况出现啦,同学的代码问题是如下语句缺了一个点,导致元素找不到而报错。

http://img1.sycdn.imooc.com//climg/5e0083c009e0993d19200871.jpg

如果我的回答帮助了你,希望采纳,祝学习愉快!

卡布琦诺 2019-12-22 18:36:34

同学你好,代码错误如下:

http://img1.sycdn.imooc.com//climg/5dff467f09cf1fd307780386.jpg

http://img1.sycdn.imooc.com//climg/5dff46950914930306750152.jpghttp://img1.sycdn.imooc.com//climg/5dff46c60903894513310263.jpghttp://img1.sycdn.imooc.com//climg/5dff46e309fff4bd06770397.jpghttp://img1.sycdn.imooc.com//climg/5dff46ee09a7668004930098.jpg

http://img1.sycdn.imooc.com//climg/5e0084360946e90509430474.jpg

http://img1.sycdn.imooc.com//climg/5dff471509873dd009140419.jpg

如果我的回答帮助了你,希望采纳,祝学习愉快!

  • 提问者 慕盖茨9092533 #1
    老师,你划了红线,我除了_和__的看明白了,其他都不明白,还多了些疑问,比如第一个红线,我粘贴的全部两个字有引号,视频中也有,不知道为何划红线,再如生成变量名,只要上下文对应就可以,而且template是模板的英语含义,为什么老师给我用红线划上了,不太理解,还有data.forEach()里的参数也给划了,不太明白,希望老师除了单斜杠和双斜杠的问题,都可以给我一点文字注释,多谢
    2019-12-23 15:34:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
热门框架Vue开发WebApp 18版
  • 参与学习           人
  • 提交作业       209    份
  • 解答问题       3299    个

本路径是通过ES6基础知识、运用Zepto、Swiper、fullPag等移动端常用工具包、以及当下流行框架Vue,结合多个实战案例,还原真实开发场景,最终实现手机端购物商城网页开发。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师