我有这段代码:
(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')
与原生函数一起使用,并且仍然可以使用我对象中的方法呢?
答案 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