jQuery-类似 vanillaJS 的库

jQuery-like library with vanillaJS

我正在构建一个类似于 jQuery 的库,但是这里有一个错误,其中行 $('#hello').addClass('blue'); 没有按预期工作。

class DOM {
    constructor(element) {
        this.element = document.querySelectorAll(element);
        Object.assign(this, this.element);
    }

    addClass(className) {
        return this.each(function(el){
            console.log(el);
            this.classList.add(className);
        });
    }

    removeClass(className){
        return this.each(function(el) {
            this.classList.remove(className);
        });
    }

    each(callback) {
        // convert this to Array to use for...of
        for ( let el of Array.from(this) ) {
            console.log(el);
            callback.call( el );
        }

    // return this for chaining
    return this;
    }
}

let $ = (selector) => new DOM(selector);
$('#hello').addClass('blue');
.blue {
  background: blue;
}
.green {
  background:green;
} 
<div id="hello">
  Hello!
</div>

我很确定您使用 assign 将元素分配给此元素的方式行不通。我不确定它是否真的可取,只需保留对该元素的引用,这样就不会那么混乱。

除此之外,您还需要为 NodeList 集合使用 forEach 而不是 each,将 fiddle 中的 addClass 更改为以下内容即可:

  addClass(className) {
    return this.element.forEach((el) => {
        el.classList.add(className);
    });
  }

编辑:仔细检查我能不能说你真的没有使用 each,那是你的 class 的内部方法。

您的代码的完整版本如下所示:

class DOM {
  constructor(element){
    this.element = document.querySelectorAll(element);
  }

  addClass(className) {
    return this.element.forEach((el) => {
        el.classList.add(className);
    });
  }

  removeClass(className){
    return this.element.forEach((el) => {
        el.classList.remove(className);
    });
  }
}

或者,如果您真的想保留 each 方法,类似的方法也可以:

class DOM {
    constructor(element){
    this.element = document.querySelectorAll(element);
  }

  addClass(className) {
    return this.each((el) => {
        el.classList.add(className);
    });
  }

    removeClass(className){
    return this.each((el) => {
        el.classList.remove(className);
    });
  }

  each(callback){
    // convert this to Array to use for...of
    for (let el of Array.from(this.element)) {
      callback(el);
    }

    // return this for chaining
    return this;
  }
}