123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 |
- if (!dojo._hasResource["dojo._base.NodeList"]) { // _hasResource checks added
- // by build. Do not use
- // _hasResource directly in
- // your code.
- dojo._hasResource["dojo._base.NodeList"] = true;
- dojo.provide("dojo._base.NodeList");
- dojo.require("dojo._base.lang");
- dojo.require("dojo._base.array");
- (function() {
- var d = dojo;
- var tnl = function(arr) {
- arr.constructor = dojo.NodeList;
- dojo._mixin(arr, dojo.NodeList.prototype);
- return arr;
- }
- dojo.NodeList = function() {
- // summary:
- // dojo.NodeList is as subclass of Array which adds syntactic
- // sugar for chaining, common iteration operations, animation,
- // and node manipulation. NodeLists are most often returned as
- // the result of dojo.query() calls.
- // example:
- // create a node list from a node
- // | new dojo.NodeList(dojo.byId("foo"));
- return tnl(Array.apply(null, arguments));
- }
- dojo.NodeList._wrap = tnl;
- dojo.extend(dojo.NodeList, {
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
- // FIXME: handle return values for #3244
- // http://trac.dojotoolkit.org/ticket/3244
- // FIXME:
- // need to wrap or implement:
- // join (perhaps w/ innerHTML/outerHTML overload for toString() of
- // items?)
- // reduce
- // reduceRight
- slice : function(/* ===== begin, end ===== */) {
- // summary:
- // Returns a new NodeList, maintaining this one in place
- // description:
- // This method behaves exactly like the Array.slice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice
- // begin: Integer
- // Can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // end: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- var a = dojo._toArray(arguments);
- return tnl(a.slice.apply(this, a));
- },
- splice : function(/* ===== index, howmany, item ===== */) {
- // summary:
- // Returns a new NodeList, manipulating this NodeList based on
- // the arguments passed, potentially splicing in new elements
- // at an offset, optionally deleting elements
- // description:
- // This method behaves exactly like the Array.splice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice
- // index: Integer
- // begin can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // howmany: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- // item: Object...?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
- var a = dojo._toArray(arguments);
- return tnl(a.splice.apply(this, a));
- },
- concat : function(/* ===== item ===== */) {
- // summary:
- // Returns a new NodeList comprised of items in this NodeList
- // as well as items passed in as parameters
- // description:
- // This method behaves exactly like the Array.concat method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat
- // item: Object...?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
- var a = dojo._toArray(arguments, 0, [this]);
- return tnl(a.concat.apply([], a));
- },
- indexOf : function(/* Object */value, /* Integer? */fromIndex) {
- // summary:
- // see dojo.indexOf(). The primary difference is that the
- // acted-on
- // array is implicitly this NodeList
- // value:
- // The value to search for.
- // fromIndex:
- // The loction to start searching from. Optional. Defaults to 0.
- // description:
- // For more details on the behavior of indexOf, see:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.indexOf(this, value, fromIndex); // Integer
- },
- lastIndexOf : function(/* ===== value, fromIndex ===== */) {
- // summary:
- // see dojo.lastIndexOf(). The primary difference is that the
- // acted-on array is implicitly this NodeList
- // description:
- // For more details on the behavior of lastIndexOf, see:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf
- // value: Object
- // The value to search for.
- // fromIndex: Integer?
- // The loction to start searching from. Optional. Defaults to 0.
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.lastIndexOf.apply(d, d._toArray(arguments, 0, [this])); // Integer
- },
- every : function(/* Function */callback, /* Object? */thisObject) {
- // summary:
- // see dojo.every() and:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every
- // Takes the same structure of arguments and returns as
- // dojo.every() with the caveat that the passed array is
- // implicitly this NodeList
- return d.every(this, callback, thisObject); // Boolean
- },
- some : function(/* Function */callback, /* Object? */thisObject) {
- // summary:
- // see dojo.some() and:
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some
- // Takes the same structure of arguments and returns as
- // dojo.some() with the caveat that the passed array is
- // implicitly this NodeList
- return d.some(this, callback, thisObject); // Boolean
- },
- map : function(/* Function */func, /* Function? */obj) {
- // summary:
- // see dojo.map(). The primary difference is that the acted-on
- // array is implicitly this NodeList and the return is a
- // dojo.NodeList (a subclass of Array)
- return d.map(this, func, obj, d.NodeList); // dojo.NodeList
- },
- forEach : function(callback, thisObj) {
- // summary:
- // see dojo.forEach(). The primary difference is that the
- // acted-on
- // array is implicitly this NodeList
- d.forEach(this, callback, thisObj);
- return this; // dojo.NodeList non-standard return to allow
- // easier chaining
- },
- // custom methods
- coords : function() {
- // summary:
- // Returns the box objects all elements in a node list as
- // an Array (*not* a NodeList)
- return d.map(this, d.coords);
- },
- style : function(/* ===== property, value ===== */) {
- // summary:
- // gets or sets the CSS property for every element in the
- // NodeList
- // property: String
- // the CSS property to get/set, in JavaScript notation
- // ("lineHieght" instead of "line-height")
- // value: String?
- // optional. The value to set the property to
- // return:
- // if no value is passed, the result is an array of strings.
- // If a value is passed, the return is this NodeList
- var aa = d._toArray(arguments, 0, [null]);
- var s = this.map(function(i) {
- aa[0] = i;
- return d.style.apply(d, aa);
- });
- return (arguments.length > 1) ? this : s; // String||dojo.NodeList
- },
- styles : function(/* ===== property, value ===== */) {
- // summary:
- // Deprecated. Use NodeList.style instead. Will be removed in
- // Dojo 1.1. Gets or sets the CSS property for every element
- // in the NodeList
- // property: String
- // the CSS property to get/set, in JavaScript notation
- // ("lineHieght" instead of "line-height")
- // value: String?
- // optional. The value to set the property to
- // return:
- // if no value is passed, the result is an array of strings.
- // If a value is passed, the return is this NodeList
- d.deprecated("NodeList.styles", "use NodeList.style instead",
- "1.1");
- return this.style.apply(this, arguments);
- },
- addClass : function(/* String */className) {
- // summary:
- // adds the specified class to every node in the list
- //
- this.forEach(function(i) {
- d.addClass(i, className);
- });
- return this;
- },
- removeClass : function(/* String */className) {
- this.forEach(function(i) {
- d.removeClass(i, className);
- });
- return this;
- },
- // FIXME: toggleClass()? connectPublisher()? connectRunOnce()?
- place : function(/* String||Node */queryOrNode, /* String */position) {
- // summary:
- // places elements of this node list relative to the first
- // element matched
- // by queryOrNode. Returns the original NodeList.
- // queryOrNode:
- // may be a string representing any valid CSS3 selector or a DOM
- // node.
- // In the selector case, only the first matching element will be
- // used
- // for relative positioning.
- // position:
- // can be one of:
- // "last"||"end" (default)
- // "first||"start"
- // "before"
- // "after"
- // or an offset in the childNodes property
- var item = d.query(queryOrNode)[0];
- position = position || "last";
- for (var x = 0; x < this.length; x++) {
- d.place(this[x], item, position);
- }
- return this; // dojo.NodeList
- },
- connect : function(/* String */methodName, /* Object||Function||String */
- objOrFunc, /* String? */funcName) {
- // summary:
- // attach event handlers to every item of the NodeList. Uses
- // dojo.connect()
- // so event properties are normalized
- // methodName:
- // the name of the method to attach to. For DOM events, this
- // should be
- // the lower-case name of the event
- // objOrFunc:
- // if 2 arguments are passed (methodName, objOrFunc), objOrFunc
- // should
- // reference a function or be the name of the function in the
- // global
- // namespace to attach. If 3 arguments are provided
- // (methodName, objOrFunc, funcName), objOrFunc must be the
- // scope to
- // locate the bound function in
- // funcName:
- // optional. A string naming the function in objOrFunc to bind
- // to the
- // event. May also be a function reference.
- // example:
- // add an onclick handler to every button on the page
- // | dojo.query("onclick", function(e){
- // | console.debug("clicked!");
- // | });
- // example:
- // attach foo.bar() to every odd div's onmouseover
- // | dojo.query("div:nth-child(odd)").onclick("onmouseover",
- // foo, "bar");
- this.forEach(function(item) {
- d.connect(item, methodName, objOrFunc, funcName);
- });
- return this; // dojo.NodeList
- },
- orphan : function(/* String? */simpleFilter) {
- // summary:
- // removes elements in this list that match the simple
- // filter from their parents and returns them as a new
- // NodeList.
- // simpleFilter: single-expression CSS filter
- // return: a dojo.NodeList of all of the elements orpahned
- var orphans = (simpleFilter) ? d._filterQueryResult(this,
- simpleFilter) : this;
- orphans.forEach(function(item) {
- if (item["parentNode"]) {
- item.parentNode.removeChild(item);
- }
- });
- return orphans; // dojo.NodeList
- },
- adopt : function(/* String||Array||DomNode */queryOrListOrNode, /* String? */
- position) {
- // summary:
- // places any/all elements in queryOrListOrNode at a
- // position relative to the first element in this list.
- // Returns a dojo.NodeList of the adopted elements.
- // queryOrListOrNode:
- // a DOM node or a query string or a query result.
- // Represents the nodes to be adopted relative to the
- // first element of this NodeList.
- // position:
- // optional. One of:
- // "last"||"end" (default)
- // "first||"start"
- // "before"
- // "after"
- // or an offset in the childNodes property
- var item = this[0];
- return d.query(queryOrListOrNode).forEach(function(ai) {
- d.place(ai, item, (position || "last"));
- }); // dojo.NodeList
- },
- // FIXME: do we need this?
- query : function(/* String */queryStr) {
- // summary:
- // Returns a new, flattened NodeList. Elements of the new list
- // satisfy the passed query but use elements of the
- // current NodeList as query roots.
- queryStr = queryStr || "";
- // FIXME: probably slow
- var ret = d.NodeList();
- this.forEach(function(item) {
- d.query(queryStr, item).forEach(function(subItem) {
- if (typeof subItem != "undefined") {
- ret.push(subItem);
- }
- });
- });
- return ret; // dojo.NodeList
- },
- filter : function(/* String */simpleQuery) {
- // summary:
- // "masks" the built-in javascript filter() method to support
- // passing a simple string filter in addition to supporting
- // filtering function objects.
- // example:
- // "regular" JS filter syntax as exposed in dojo.filter:
- // | dojo.query("*").filter(function(item){
- // | // highlight every paragraph
- // | return (item.nodeName == "p");
- // | }).styles("backgroundColor", "yellow");
- // example:
- // the same filtering using a CSS selector
- // | dojo.query("*").filter("p").styles("backgroundColor",
- // "yellow");
- var items = this;
- var _a = arguments;
- var r = d.NodeList();
- var rp = function(t) {
- if (typeof t != "undefined") {
- r.push(t);
- }
- }
- if (d.isString(simpleQuery)) {
- items = d._filterQueryResult(this, _a[0]);
- if (_a.length == 1) {
- // if we only got a string query, pass back the filtered
- // results
- return items; // dojo.NodeList
- }
- // if we got a callback, run it over the filtered items
- d.forEach(d.filter(items, _a[1], _a[2]), rp);
- return r; // dojo.NodeList
- }
- // handle the (callback, [thisObject]) case
- d.forEach(d.filter(items, _a[0], _a[1]), rp);
- return r; // dojo.NodeList
- },
- /*
- * // FIXME: should this be "copyTo" and include parenting info?
- * clone: function(){ // summary: // creates node clones of each
- * element of this list // and returns a new list containing the
- * clones },
- */
- addContent : function(/* String */content, /* String||Integer? */
- position) {
- // summary:
- // add a node or some HTML as a string to every item in the
- // list.
- // Returns the original list.
- // content:
- // the HTML in string format to add at position to every item
- // position:
- // One of:
- // "last"||"end" (default)
- // "first||"start"
- // "before"
- // "after"
- // or an integer offset in the childNodes property
- var ta = d.doc.createElement("span");
- if (d.isString(content)) {
- ta.innerHTML = content;
- } else {
- ta.appendChild(content);
- }
- var ct = ((position == "first") || (position == "after"))
- ? "lastChild"
- : "firstChild";
- this.forEach(function(item) {
- var tn = ta.cloneNode(true);
- while (tn[ct]) {
- d.place(tn[ct], item, position);
- }
- });
- return this; // dojo.NodeList
- }
- });
- // syntactic sugar for DOM events
- d.forEach(["blur", "click", "keydown", "keypress", "keyup",
- "mousedown", "mouseenter", "mouseleave", "mousemove",
- "mouseout", "mouseover", "mouseup"], function(evt) {
- var _oe = "on" + evt;
- dojo.NodeList.prototype[_oe] = function(a, b) {
- return this.connect(_oe, a, b);
- }
- // FIXME: should these events trigger publishes?
- /*
- * return (a ? this.connect(_oe, a, b) :
- * this.forEach(function(n){ // FIXME: // listeners get buried
- * by // addEventListener and can't be dug back // out to be
- * triggered externally. // see: //
- * http://developer.mozilla.org/en/docs/DOM:element
- *
- * console.debug(n, evt, _oe);
- * // FIXME: need synthetic event support! var _e = { target:
- * n, faux: true, type: evt }; //
- * dojo._event_listener._synthesizeEvent({}, { target: n, faux:
- * true, type: evt }); try{ n[evt](_e); }catch(e){
- * console.debug(e); } try{ n[_oe](_e); }catch(e){
- * console.debug(e); } }) ); }
- */
- });
- })();
- }
|