34255 lines · 1.2 MB · JavaScript
RawDownload
//////////////////////////////////////////var JQLitePrototype = JQLite.prototype = {  ready: jqLiteReady,  toString: function() {    var value = [];    forEach(this, function(e) { value.push('' + e);});    return '[' + value.join(', ') + ']';  },   eq: function(index) {      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);  },   length: 0,  push: push,  sort: [].sort,  splice: [].splice}; //////////////////////////////////////////// Functions iterating getter/setters.// these functions return self on setter and// value on get.//////////////////////////////////////////var BOOLEAN_ATTR = {};forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {  BOOLEAN_ATTR[lowercase(value)] = value;});var BOOLEAN_ELEMENTS = {};forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {  BOOLEAN_ELEMENTS[value] = true;});var ALIASED_ATTR = {  'ngMinlength': 'minlength',  'ngMaxlength': 'maxlength',  'ngMin': 'min',  'ngMax': 'max',  'ngPattern': 'pattern',  'ngStep': 'step'}; function getBooleanAttrName(element, name) {  // check dom last since we will most likely fail on name  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];   // booleanAttr is here twice to minimize DOM access  return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;} function getAliasedAttrName(name) {  return ALIASED_ATTR[name];} forEach({  data: jqLiteData,  removeData: jqLiteRemoveData,  hasData: jqLiteHasData,  cleanData: function jqLiteCleanData(nodes) {    for (var i = 0, ii = nodes.length; i < ii; i++) {      jqLiteRemoveData(nodes[i]);    }  }}, function(fn, name) {  JQLite[name] = fn;}); forEach({  data: jqLiteData,  inheritedData: jqLiteInheritedData,   scope: function(element) {    // Can't use jqLiteData here directly so we stay compatible with jQuery!    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);  },   isolateScope: function(element) {    // Can't use jqLiteData here directly so we stay compatible with jQuery!    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');  },   controller: jqLiteController,   injector: function(element) {    return jqLiteInheritedData(element, '$injector');  },   removeAttr: function(element, name) {    element.removeAttribute(name);  },   hasClass: jqLiteHasClass,   css: function(element, name, value) {    name = cssKebabToCamel(name);     if (isDefined(value)) {      element.style[name] = value;    } else {      return element.style[name];    }  },   attr: function(element, name, value) {    var ret;    var nodeType = element.nodeType;    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT ||      !element.getAttribute) {      return;    }     var lowercasedName = lowercase(name);    var isBooleanAttr = BOOLEAN_ATTR[lowercasedName];     if (isDefined(value)) {      // setter       if (value === null || (value === false && isBooleanAttr)) {        element.removeAttribute(name);      } else {        element.setAttribute(name, isBooleanAttr ? lowercasedName : value);      }    } else {      // getter       ret = element.getAttribute(name);       if (isBooleanAttr && ret !== null) {        ret = lowercasedName;      }      // Normalize non-existing attributes to undefined (as jQuery).      return ret === null ? undefined : ret;    }  },   prop: function(element, name, value) {    if (isDefined(value)) {      element[name] = value;    } else {      return element[name];    }  },   text: (function() {    getText.$dv = '';    return getText;     function getText(element, value) {      if (isUndefined(value)) {        var nodeType = element.nodeType;        return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';      }      element.textContent = value;    }  })(),   val: function(element, value) {    if (isUndefined(value)) {      if (element.multiple && nodeName_(element) === 'select') {        var result = [];        forEach(element.options, function(option) {          if (option.selected) {            result.push(option.value || option.text);          }        });        return result;      }      return element.value;    }    element.value = value;  },   html: function(element, value) {    if (isUndefined(value)) {      return element.innerHTML;    }    jqLiteDealoc(element, true);    element.innerHTML = value;  },   empty: jqLiteEmpty}, function(fn, name) {  /**   * Properties: writes return selection, reads return first value   */  JQLite.prototype[name] = function(arg1, arg2) {    var i, key;    var nodeCount = this.length;     // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it    // in a way that survives minification.    // jqLiteEmpty takes no arguments but is a setter.    if (fn !== jqLiteEmpty &&        (isUndefined((fn.length === 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) {      if (isObject(arg1)) {         // we are a write, but the object properties are the key/values        for (i = 0; i < nodeCount; i++) {          if (fn === jqLiteData) {            // data() takes the whole object in jQuery            fn(this[i], arg1);          } else {            for (key in arg1) {              fn(this[i], key, arg1[key]);            }          }        }        // return self for chaining        return this;      } else {        // we are a read, so read the first child.        // TODO: do we still need this?        var value = fn.$dv;        // Only if we have $dv do we iterate over all, otherwise it is just the first element.        var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount;        for (var j = 0; j < jj; j++) {          var nodeValue = fn(this[j], arg1, arg2);          value = value ? value + nodeValue : nodeValue;        }        return value;      }    } else {      // we are a write, so apply to all children      for (i = 0; i < nodeCount; i++) {        fn(this[i], arg1, arg2);      }      // return self for chaining      return this;    }  };}); function createEventHandler(element, events) {  var eventHandler = function(event, type) {    // jQuery specific api    event.isDefaultPrevented = function() {      return event.defaultPrevented;    };     var eventFns = events[type || event.type];    var eventFnsLength = eventFns ? eventFns.length : 0;     if (!eventFnsLength) return;     if (isUndefined(event.immediatePropagationStopped)) {      var originalStopImmediatePropagation = event.stopImmediatePropagation;      event.stopImmediatePropagation = function() {        event.immediatePropagationStopped = true;         if (event.stopPropagation) {          event.stopPropagation();        }         if (originalStopImmediatePropagation) {          originalStopImmediatePropagation.call(event);        }      };    }     event.isImmediatePropagationStopped = function() {      return event.immediatePropagationStopped === true;    };     // Some events have special handlers that wrap the real handler    var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper;     // Copy event handlers in case event handlers array is modified during execution.    if ((eventFnsLength > 1)) {      eventFns = shallowCopy(eventFns);    }     for (var i = 0; i < eventFnsLength; i++) {      if (!event.isImmediatePropagationStopped()) {        handlerWrapper(element, event, eventFns[i]);      }    }  };   // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all  //       events on `element`  eventHandler.elem = element;  return eventHandler;} function defaultHandlerWrapper(element, event, handler) {  handler.call(element, event);} function specialMouseHandlerWrapper(target, event, handler) {  // Refer to jQuery's implementation of mouseenter & mouseleave  // Read about mouseenter and mouseleave:  // http://www.quirksmode.org/js/events_mouse.html#link8  var related = event.relatedTarget;  // For mousenter/leave call the handler if related is outside the target.  // NB: No relatedTarget if the mouse left/entered the browser window  if (!related || (related !== target && !jqLiteContains.call(target, related))) {    handler.call(target, event);  }} //////////////////////////////////////////// Functions iterating traversal.// These functions chain results into a single// selector.//////////////////////////////////////////forEach({  removeData: jqLiteRemoveData,   on: function jqLiteOn(element, type, fn, unsupported) {    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');     // Do not add event handlers to non-elements because they will not be cleaned up.    if (!jqLiteAcceptsData(element)) {      return;    }     var expandoStore = jqLiteExpandoStore(element, true);    var events = expandoStore.events;    var handle = expandoStore.handle;     if (!handle) {      handle = expandoStore.handle = createEventHandler(element, events);    }     // http://jsperf.com/string-indexof-vs-split    var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];    var i = types.length;     var addHandler = function(type, specialHandlerWrapper, noEventListener) {      var eventFns = events[type];       if (!eventFns) {        eventFns = events[type] = [];        eventFns.specialHandlerWrapper = specialHandlerWrapper;        if (type !== '$destroy' && !noEventListener) {          element.addEventListener(type, handle);        }      }       eventFns.push(fn);    };     while (i--) {      type = types[i];      if (MOUSE_EVENT_MAP[type]) {        addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper);        addHandler(type, undefined, true);      } else {        addHandler(type);      }    }  },   off: jqLiteOff,   one: function(element, type, fn) {    element = jqLite(element);     //add the listener twice so that when it is called    //you can remove the original function and still be    //able to call element.off(ev, fn) normally    element.on(type, function onFn() {      element.off(type, fn);      element.off(type, onFn);    });    element.on(type, fn);  },   replaceWith: function(element, replaceNode) {    var index, parent = element.parentNode;    jqLiteDealoc(element);    forEach(new JQLite(replaceNode), function(node) {      if (index) {        parent.insertBefore(node, index.nextSibling);      } else {        parent.replaceChild(node, element);      }      index = node;    });  },   children: function(element) {    var children = [];    forEach(element.childNodes, function(element) {      if (element.nodeType === NODE_TYPE_ELEMENT) {        children.push(element);      }    });    return children;  },   contents: function(element) {    return element.contentDocument || element.childNodes || [];  },   append: function(element, node) {    var nodeType = element.nodeType;    if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;     node = new JQLite(node);     for (var i = 0, ii = node.length; i < ii; i++) {      var child = node[i];      element.appendChild(child);    }  },   prepend: function(element, node) {    if (element.nodeType === NODE_TYPE_ELEMENT) {      var index = element.firstChild;      forEach(new JQLite(node), function(child) {        element.insertBefore(child, index);      });    }  },   wrap: function(element, wrapNode) {    jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]);  },   remove: jqLiteRemove,   detach: function(element) {    jqLiteRemove(element, true);  },   after: function(element, newElement) {    var index = element, parent = element.parentNode;     if (parent) {      newElement = new JQLite(newElement);       for (var i = 0, ii = newElement.length; i < ii; i++) {        var node = newElement[i];        parent.insertBefore(node, index.nextSibling);        index = node;      }    }  },   addClass: jqLiteAddClass,  removeClass: jqLiteRemoveClass,   toggleClass: function(element, selector, condition) {    if (selector) {      forEach(selector.split(' '), function(className) {        var classCondition = condition;        if (isUndefined(classCondition)) {          classCondition = !jqLiteHasClass(element, className);        }        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);      });    }  },   parent: function(element) {    var parent = element.parentNode;    return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;  },   next: function(element) {    return element.nextElementSibling;  },   find: function(element, selector) {    if (element.getElementsByTagName) {      return element.getElementsByTagName(selector);    } else {      return [];    }  },   clone: jqLiteClone,   triggerHandler: function(element, event, extraParameters) {     var dummyEvent, eventFnsCopy, handlerArgs;    var eventName = event.type || event;    var expandoStore = jqLiteExpandoStore(element);    var events = expandoStore && expandoStore.events;    var eventFns = events && events[eventName];     if (eventFns) {      // Create a dummy event to pass to the handlers      dummyEvent = {        preventDefault: function() { this.defaultPrevented = true; },        isDefaultPrevented: function() { return this.defaultPrevented === true; },        stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },        isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },        stopPropagation: noop,        type: eventName,        target: element      };       // If a custom event was provided then extend our dummy event with it      if (event.type) {        dummyEvent = extend(dummyEvent, event);      }       // Copy event handlers in case event handlers array is modified during execution.      eventFnsCopy = shallowCopy(eventFns);

Lines 3501–4000 of 34255. Previous lines

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t