todomvc
Version:
> Helping you select an MV\* framework
173 lines (157 loc) • 4.44 kB
JavaScript
/*!
* CanJS - 2.0.3
* http://canjs.us/
* Copyright (c) 2013 Bitovi
* Tue, 26 Nov 2013 18:21:22 GMT
* Licensed MIT
* Includes: CanJS default build
* Download from: http://canjs.us/
*/
define(["jquery", "can/util/can", "can/util/array/each", "can/util/inserted", "can/util/event"], function($, can) {
var isBindableElement = function(node){
//console.log((node.nodeName && (node.nodeType == 1 || node.nodeType == 9) || node === window))
return (node.nodeName && (node.nodeType == 1 || node.nodeType == 9) || node == window);
};
// _jQuery node list._
$.extend( can, $, {
trigger: function( obj, event, args ) {
if(obj.nodeName || obj === window) {
$.event.trigger( event, args, obj, true );
} else if ( obj.trigger ) {
obj.trigger( event, args );
} else {
if(typeof event === 'string'){
event = {type: event}
}
event.target = event.target || obj;
can.dispatch.call(obj, event, args);
}
},
addEvent: can.addEvent,
removeEvent: can.removeEvent,
// jquery caches fragments, we always needs a new one
buildFragment : function(elems, context){
var oldFragment = $.buildFragment,
ret;
elems = [elems];
// Set context per 1.8 logic
context = context || document;
context = !context.nodeType && context[0] || context;
context = context.ownerDocument || context;
ret = oldFragment.call( jQuery, elems, context);
return ret.cacheable ? $.clone(ret.fragment) : ret.fragment || ret;
},
$: $,
each: can.each,
bind: function( ev, cb){
// If we can bind to it...
if(this.bind && this.bind !== can.bind){
this.bind(ev, cb)
} else if(isBindableElement(this)) {
$.event.add(this, ev, cb);
} else {
// Make it bind-able...
can.addEvent.call(this, ev, cb)
}
return this;
},
unbind: function(ev, cb){
// If we can bind to it...
if(this.unbind && this.unbind !== can.unbind){
this.unbind(ev, cb)
} else if(isBindableElement(this)) {
$.event.remove(this, ev, cb);
} else {
// Make it bind-able...
can.removeEvent.call(this, ev, cb)
}
return this;
},
delegate: function(selector, ev , cb){
if(this.delegate) {
this.delegate(selector, ev , cb)
}
else if(isBindableElement(this)) {
$(this).delegate(selector, ev, cb)
} else {
// make it bind-able ...
}
return this;
},
undelegate: function(selector, ev , cb){
if(this.undelegate) {
this.undelegate(selector, ev , cb)
}
else if(isBindableElement(this)) {
$(this).undelegate(selector, ev, cb)
} else {
// make it bind-able ...
}
return this;
}
});
// Wrap binding functions.
/*$.each(['bind','unbind','undelegate','delegate'],function(i,func){
can[func] = function(){
var t = this[func] ? this : $([this]);
t[func].apply(t, arguments);
return this;
};
});*/
// Aliases
can.on = can.bind;
can.off = can.unbind;
// Wrap modifier functions.
$.each(["append","filter","addClass","remove","data","get","has"], function(i,name){
can[name] = function(wrapped){
return wrapped[name].apply(wrapped, can.makeArray(arguments).slice(1));
};
});
// Memory safe destruction.
var oldClean = $.cleanData;
$.cleanData = function( elems ) {
$.each( elems, function( i, elem ) {
if ( elem ) {
can.trigger(elem,"removed",[],false);
}
});
oldClean(elems);
};
var oldDomManip = $.fn.domManip,
cbIndex;
// feature detect which domManip we are using
$.fn.domManip = function(args, cb1, cb2){
for(var i = 1; i< arguments.length; i++){
if(typeof arguments[i] === "function"){
cbIndex = i;
break;
}
}
return oldDomManip.apply(this, arguments)
}
$(document.createElement("div")).append(document.createElement("div"))
$.fn.domManip = (cbIndex == 2 ?
function(args, table, callback){
return oldDomManip.call(this,args,table, function(elem){
if(elem.nodeType === 11){
var elems = can.makeArray(elem.childNodes);
}
var ret = callback.apply(this, arguments);
can.inserted(elems ? elems : [elem]);
return ret;
})
} :
function(args, callback){
return oldDomManip.call(this,args,function(elem){
if(elem.nodeType === 11){
var elems = can.makeArray(elem.childNodes);
}
var ret = callback.apply(this, arguments);
can.inserted(elems ? elems : [elem]);
return ret;
})
})
$.event.special.inserted = {};
$.event.special.removed = {};
return can;
});