X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/6746dc89c47ed01b165cc1152533605f97eb8e8d..f562e4c6e5fac7bcb445985b99acbea4d706e6f0:/src/core/src/dom/DomQuery.js diff --git a/src/core/src/dom/DomQuery.js b/src/core/src/dom/DomQuery.js index 7ab67bd4..97e147af 100644 --- a/src/core/src/dom/DomQuery.js +++ b/src/core/src/dom/DomQuery.js @@ -91,6 +91,7 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ tagTokenRe = /^(#)?([\w-\*]+)/, nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/, + startIdRe = /^\s*\#/, // This is for IE MSXML which does not support expandos. // IE runs the same speed using setAttribute, however FF slows way down // and Safari completely fails so they need to continue to use expandos. @@ -542,8 +543,8 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ * Use {@link #select} to take advantage of browsers built-in support for CSS selectors. * * @param {String} selector The selector/xpath query (can be a comma separated list of selectors) - * @param {Node/String} root (optional) The start of the query (defaults to document). - * @return {Array} An Array of DOM elements which match the selector. If there are + * @param {HTMLElement/String} root (optional) The start of the query (defaults to document). + * @return {HTMLElement[]} An Array of DOM elements which match the selector. If there are * no matches, and empty Array is returned. */ jsSelect: function(path, root, type){ @@ -595,26 +596,46 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ * Selects an array of DOM nodes by CSS/XPath selector. * * Uses [document.querySelectorAll][0] if browser supports that, otherwise falls back to - * {@link #jsSelect} to do the work. - * + * {@link Ext.DomQuery#jsSelect} to do the work. + * * Aliased as {@link Ext#query}. - * + * * [0]: https://developer.mozilla.org/en/DOM/document.querySelectorAll * * @param {String} path The selector/xpath query - * @param {Node} root (optional) The start of the query (defaults to document). - * @return {Array} An array of DOM elements (not a NodeList as returned by `querySelectorAll`). + * @param {HTMLElement} root (optional) The start of the query (defaults to document). + * @return {HTMLElement[]} An array of DOM elements (not a NodeList as returned by `querySelectorAll`). * Empty array when no matches. * @method */ select : document.querySelectorAll ? function(path, root, type) { root = root || document; - if (!Ext.DomQuery.isXml(root)) { - try { - var cs = root.querySelectorAll(path); - return Ext.Array.toArray(cs); - } - catch (ex) {} + /* + * Safari 3.x can't handle uppercase or unicode characters when in quirks mode. + */ + if (!Ext.DomQuery.isXml(root) && !(Ext.isSafari3 && !Ext.isStrict)) { + try { + /* + * This checking here is to "fix" the behaviour of querySelectorAll + * for non root document queries. The way qsa works is intentional, + * however it's definitely not the expected way it should work. + * More info: http://ejohn.org/blog/thoughts-on-queryselectorall/ + * + * We only modify the path for single selectors (ie, no multiples), + * without a full parser it makes it difficult to do this correctly. + */ + var isDocumentRoot = root.nodeType === 9, + _path = path, + _root = root; + + if (!isDocumentRoot && path.indexOf(',') === -1 && !startIdRe.test(path)) { + _path = '#' + Ext.id(root) + ' ' + path; + _root = root.parentNode; + } + return Ext.Array.toArray(_root.querySelectorAll(_path)); + } + catch (e) { + } } return Ext.DomQuery.jsSelect.call(this, path, root, type); } : function(path, root, type) { @@ -624,8 +645,8 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ /** * Selects a single element. * @param {String} selector The selector/xpath query - * @param {Node} root (optional) The start of the query (defaults to document). - * @return {Element} The DOM element which matched the selector. + * @param {HTMLElement} root (optional) The start of the query (defaults to document). + * @return {HTMLElement} The DOM element which matched the selector. */ selectNode : function(path, root){ return Ext.DomQuery.select(path, root)[0]; @@ -634,8 +655,8 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ /** * Selects the value of a node, optionally replacing null with the defaultValue. * @param {String} selector The selector/xpath query - * @param {Node} root (optional) The start of the query (defaults to document). - * @param {String} defaultValue + * @param {HTMLElement} root (optional) The start of the query (defaults to document). + * @param {String} defaultValue (optional) When specified, this is return as empty value. * @return {String} */ selectValue : function(path, root, defaultValue){ @@ -659,8 +680,8 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ /** * Selects the value of a node, parsing integers and floats. Returns the defaultValue, or 0 if none is specified. * @param {String} selector The selector/xpath query - * @param {Node} root (optional) The start of the query (defaults to document). - * @param {Number} defaultValue + * @param {HTMLElement} root (optional) The start of the query (defaults to document). + * @param {Number} defaultValue (optional) When specified, this is return as empty value. * @return {Number} */ selectNumber : function(path, root, defaultValue){ @@ -670,7 +691,7 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ /** * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child) - * @param {String/HTMLElement/Array} el An element id, element or array of elements + * @param {String/HTMLElement/HTMLElement[]} el An element id, element or array of elements * @param {String} selector The simple selector to test * @return {Boolean} */ @@ -685,11 +706,11 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ /** * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child) - * @param {Array} el An array of elements to filter + * @param {HTMLElement[]} el An array of elements to filter * @param {String} selector The simple selector to test * @param {Boolean} nonMatches If true, it returns the elements that DON'T match * the selector instead of the ones that match - * @return {Array} An Array of DOM elements which match the selector. If there are + * @return {HTMLElement[]} An Array of DOM elements which match the selector. If there are * no matches, and empty Array is returned. */ filter : function(els, ss, nonMatches){ @@ -756,12 +777,12 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ }, /** -Object hash of "pseudo class" filter functions which are used when filtering selections. +Object hash of "pseudo class" filter functions which are used when filtering selections. Each function is passed two parameters: - **c** : Array An Array of DOM elements to filter. - + - **v** : String The argument (if any) supplied in the selector. @@ -973,12 +994,10 @@ Then external links could be gathered with the following statement: }(); /** - * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Ext.DomQuery#select} - * @param {String} path The selector/xpath query - * @param {Node} root (optional) The start of the query (defaults to document). - * @return {Array} + * Shorthand of {@link Ext.DomQuery#select} * @member Ext * @method query + * @alias Ext.DomQuery#select */ Ext.query = Ext.DomQuery.select;