2

我有这个代码:

(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')本机函数并仍然使它与我的对象中的方法一起使用呢?

4

2 回答 2

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) {
      // ...
于 2012-06-13T17:24:57.260 回答
0

我认为您可以使用原型(不推荐)来做到这一点:

// 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
于 2012-06-13T19:57:11.830 回答