老师,麻烦看下这个问题

正在回答 回答被采纳积分+1

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

1回答
好帮手慕言 2021-05-06 10:44:04

同学你好,从提供的报错截图来看,可能是因为元素没有获取到,使用nodeType会报错,建议:为了准确的定位到问题,把完整的代码粘贴上来(不要截图),祝学习愉快~

  • 提问者 不朽3453558 #1
    base.js
    import {ELEMENT_NODE_TYPE} from './constants';

    import DEFAULTS from './default';



    class BaseSlider {
        constructor(el) {
            if (el.nodeType !== ELEMENT_NODE_TYPE) {
              throw new Error('实例化的时候,请传入 DOM 元素!');
            }
      
          实际参数
          this.options = {
            ...DEFAULTS,
            ...options
          };

            const sliderEL = el;

            const sliderContentEl = sliderEL.querySelector(".slider-content");
            const sliderItemEls = sliderContentEl.querySelectorAll(".slider-item");

            //添加到this上,为了在方法使用
            this.sliderEL = sliderEL;
            this.sliderContentEl = sliderContentEl;
            this.sliderItemEls = sliderItemEls;
            
            this.minIndex = 0;
            this.maxIndex = sliderItemEls.length - 1;
            
            this.currIndex = this.getCorrectedIndex(this.options.initiallindex,
                );

            //每个slider-item 的宽度(每次移动的距离)
            this.itemWidth = sliderItemEls[0].offsetWidth;

            this.init();

           }
           //初始化
           init(){
            //    为每个slider-item设置宽度
            this.setItemsWidth();

            // 为slider-content设置宽度
            this.setContentWidth();
           }

            // 为每个slider-item设置宽度
            setItemsWidth(){
                for(const item of this.sliderItemEls){
                    item.style.width = `${this.itemWidth}px`;
                }
            }

            // 为slider-content设置宽度
            setContentWidth(){
                this.sliderContentEl.style.width = `${this.itemWidth * this.sliderItemEls.length}px`;
           }

            //获取修正后的索引值
            getCorrectedIndeex(index){
                if(index<this.minIndex) return this.maxIndex;
                if(index>this.minIndex) return this.minIndex;
                return index;
            }


    }



    export default BaseSlider;

    constants.js
    //keyboard
    export const LEDT_KEYCODE = 37;
    export const RIGHT_KEYCODE = 39;

     //base
     export const ELEMENT_NODE_TYPE = 1;
     
     default.js
     //默认参数
    const DEFAULTS = {
        //初始索引
        initiallindex:0,
        //切换时是否有动画
        Animation:true,
        //切换速度,单位ms
        speed:300,
        //自动切换,单位ms
        autoplay:0
    };

    export default DEFAULTS;

    index.js
    import BaseSlider from './base.js';
    import keyboard from './keyboard.js';

    // 继承基类
    class Slider extends BaseSlider {
      constructor(el) {
        super(el);

        this.bindEvent();
      }

      bindEvent() {
        keyboard.bindEvent(this);
      }
    }

    export default Slider;

    keyboard.js
    // 添加键盘控制
    import { LEFT_KEYCODE, RIGHT_KEYCODE } from './constants.js';

    const keyboard = {
      bindEvent(slider) {
        document.addEventListener(
          'keyup',
          ev => {
            if (ev.keyCode === LEFT_KEYCODE) {
              slider.prev();
            } else if (ev.keyCode === RIGHT_KEYCODE) {
              slider.next();
            }
          },
          false
        );
      }
    };

    export default keyboard;

    slider/index.js
    import './slider.css'

    import Slider from './module';

    new Slider(document.querySelector('slider'));

    slider.art
    <div class="slider">
        <ul class="slider-content">
            <li class="slider-item">
                <a href="#">
                    <img src="images/banner1.jpg" alt="" class="slider-img">
                </a>
            </li>
            <li class="slider-item">
                <a href="#">
                    <img src="images/banner2.jpg" alt="" class="slider-img">
                </a>
            </li>
            <li class="slider-item">
                <a href="#">
                    <img src="images/banner3.jpg" alt="" class="slider-img">
                </a>
            </li>
            <li class="slider-item">
                <a href="#">
                    <img src="images/banner4.jpg" alt="" class="slider-img">
                </a>
            </li>
            <li class="slider-item">
                <a href="#">
                    <img src="images/banner5.jpg" alt="" class="slider-img">
                </a>
            </li>
        </ul>
    </div>

    ​slider.css
    ​.slider,
    .slider-content,
    .slider-item,
    .slider-img {
    width: 100%;
    height: 100%;
    }
    .slider {
    overflow: hidden;
    }
    .slider-item {
    float: left;
    }
    .slider-img {
    /* display: block; */
    vertical-align: top;
    }
    .slider-animation {
    transition-property: transform;
    transition-duration: 0ms;
    }

    el. nodetype 获取不到

    2021-05-07 00:02:28
  • 提问者 不朽3453558 #2
    base.js
    ​import {ELEMENT_NODE_TYPE} from './constants';

    import DEFAULTS from './default';



    class BaseSlider {
    constructor(el,options) {
    console.log(el);
    if (el.nodeType !== ELEMENT_NODE_TYPE) {
    throw new Error('实例化的时候,请传入 DOM 元素!');
    }

    实际参数
    this.options = {
    ...DEFAULTS,
    ...options
    };

    const sliderEL = el;

    const sliderContentEl = sliderEL.querySelector(".slider-content");
    const sliderItemEls = sliderContentEl.querySelectorAll(".slider-item");

    //添加到this上,为了在方法使用
    this.sliderEL = sliderEL;
    this.sliderContentEl = sliderContentEl;
    this.sliderItemEls = sliderItemEls;

    this.minIndex = 0;
    this.maxIndex = sliderItemEls.length - 1;

    this.currIndex = this.getCorrectedIndex(this.options.initiallindex,
    );

    //每个slider-item 的宽度(每次移动的距离)
    this.itemWidth = sliderItemEls[0].offsetWidth;

    this.init();

    }
    //初始化
    init(){
    // 为每个slider-item设置宽度
    this.setItemsWidth();

    // 为slider-content设置宽度
    this.setContentWidth();
    }

    // 为每个slider-item设置宽度
    setItemsWidth(){
    for(const item of this.sliderItemEls){
    item.style.width = `${this.itemWidth}px`;
    }
    }

    // 为slider-content设置宽度
    setContentWidth(){
    this.sliderContentEl.style.width = `${this.itemWidth * this.sliderItemEls.length}px`;
    }

    //获取修正后的索引值
    getCorrectedIndeex(index){
    if(index<this.minIndex) return this.maxIndex;
    if(index>this.minIndex) return this.minIndex;
    return index;
    }


    }



    export default BaseSlider;

    index.js
    import BaseSlider from './base.js';
    import keyboard from './keyboard.js';

    // 继承基类
    class Slider extends BaseSlider {
    constructor(el,options) {
    super(el,options);

    this.bindEvent();
    }

    bindEvent() {
    keyboard.bindEvent(this);
    }
    }

    export default Slider;

    base.js和index.js用下面这个 ,


    2021-05-07 00:10:17
  • 提问者 不朽3453558 #3

    老师 我已经测试好了。一个很简单的小错误,自己没细心处理好 谢谢了

    2021-05-07 00:21:51
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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