querySelectorAll与自定义库

时间:2012-06-13 17:17:21

标签: javascript object frameworks css-selectors

我有这段代码:

(function() {

var base = function (elem) {

    var elements = document.querySelectorAll(elem);

    return {
        elems: elements[0],
        on: function (evt, func) {
            if(this.elems) this.elems.addEventListener(evt, func, false);
            return this;
        }
    };
};


window.base = window._ = base;

})();

我可以这样做:

_('form').on('submit', uploadImage);

但如果我这样做:

_('form').appendChild(input);

我收到错误:Object #<Object> has no method 'appendChild'

那么我怎样才能将_('element')与原生函数一起使用,并且仍然可以使用我对象中的方法呢?

2 个答案:

答案 0 :(得分:1)

为您的对象提供一个.appendChild函数,该函数调用元素上的.appendChild

(function() {

    var base = function (elem) {

        var elements = document.querySelectorAll(elem);

        return {
            elems: elements[0],
            on: function (evt, func) {
                if(this.elems) this.elems.addEventListener(evt, func, false);
                return this;
            },
            appendChild: function(el) {
                this.elems.appendChild(el);
                return this;
        };
    };


    window.base = window._ = base;

})();

旁注。如果您只对querySelectorAll返回的第一个元素感兴趣,则可以使用querySelector代替。

return {
    elems: document.querySelector(elem),
    on: function (evt, func) {
      // ...

答案 1 :(得分:0)

我认为你可以用原型(not recommended)来做到这一点:

// Prototype.js style
var Base = function (selector) {
    return document.querySelector(selector);
};

Element.prototype.on = function (e, f) {
    this.addEventListener(e, f, false);
    return this;
};

elp = Base('#result');
elp.on('click', function () {
    console.log(this);
});

elp instanceof Element; // true
elp.innerHTML; // text

或者使用对象包装器:

// jQuery style
var Base = function (selector) {
    this[0] = document.querySelector(selector);
    return this;
};

Base.prototype.on = function (e, f) {
    this[0].addEventListener(e, f, false);
    return this;
};

elj = new Base('#result'); // internal new called in jQuery
elj.on('click', function () {
    console.log(this);
});

elj instanceof Base; // true
elj[0] instanceof Element; //true
elj[0].innerHTML; // text