From c904fe7664187384c6d1875f7cf8ed6702bda51a Mon Sep 17 00:00:00 2001 From: Sam Stephenson Date: Mon, 8 Oct 2007 21:29:27 +0000 Subject: [PATCH] prototype: Deprecate document.getElementsByClassName and Element#getElementsByClassName since native versions return a NodeList and we can only return an Array. Please use $$ or Element#select instead. --- CHANGELOG | 3 +++ src/deprecated.js | 35 +++++++++++++++++++++++++++++++++++ src/dom.js | 33 --------------------------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d61f9eb..c6222b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ *SVN* +* Deprecate document.getElementsByClassName and Element#getElementsByClassName since native versions return a NodeList and we can only return an Array. Please use $$ or Element#select instead. [sam] + For more information see https://bugzilla.mozilla.org/show_bug.cgi?id=390411 + * Fix missing "var" in selector.js. Closes #9761. [Tobie Langel] * Date#toJSON now returns times in UTC for better compatibility with json.js. Closes #9332. [Tobie Langel] diff --git a/src/deprecated.js b/src/deprecated.js index b669303..59d91fe 100644 --- a/src/deprecated.js +++ b/src/deprecated.js @@ -113,6 +113,41 @@ var Position = { /*--------------------------------------------------------------------------*/ +if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ + function iter(name) { + return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; + } + + instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? + function(element, className) { + className = className.toString().strip(); + var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); + return cond ? document._getElementsByXPath('.//*' + cond, element) : []; + } : function(element, className) { + className = className.toString().strip(); + var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); + if (!classNames && !className) return elements; + + var nodes = $(element).getElementsByTagName('*'); + className = ' ' + className + ' '; + + for (var i = 0, child, cn; child = nodes[i]; i++) { + if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || + (classNames && classNames.all(function(name) { + return !name.toString().blank() && cn.include(' ' + name + ' '); + })))) + elements.push(Element.extend(child)); + } + return elements; + }; + + return function(className, parentElement) { + return $(parentElement || document.body).getElementsByClassName(className); + }; +}(Element.Methods); + +/*--------------------------------------------------------------------------*/ + Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { diff --git a/src/dom.js b/src/dom.js index f9306c8..cdce566 100644 --- a/src/dom.js +++ b/src/dom.js @@ -633,39 +633,6 @@ Element.Methods = { Element.Methods.identify.counter = 1; -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ - function iter(name) { - return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; - } - - instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? - function(element, className) { - className = className.toString().strip(); - var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); - return cond ? document._getElementsByXPath('.//*' + cond, element) : []; - } : function(element, className) { - className = className.toString().strip(); - var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); - if (!classNames && !className) return elements; - - var nodes = $(element).getElementsByTagName('*'); - className = ' ' + className + ' '; - - for (var i = 0, child, cn; child = nodes[i]; i++) { - if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || - (classNames && classNames.all(function(name) { - return !name.toString().blank() && cn.include(' ' + name + ' '); - })))) - elements.push(Element.extend(child)); - } - return elements; - }; - - return function(className, parentElement) { - return $(parentElement || document.body).getElementsByClassName(className); - }; -}(Element.Methods); - Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, childElements: Element.Methods.immediateDescendants