$A() does not accept a collection of elements to extend, this is
clearly stated in the documentation as they give a clean example of
how one can do that, but it does not behave that way by default.  What
it does do though, is receive a NodeList object such as a collection
returned by getElementsByTagName and convert it to a regular JS Array,
which is indeed extended, but with prototype's Array methods.

http://prototypejs.org/api/utility/dollar-a

Cheers



On May 1, 12:41 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
> You can replace all of getRowCells with something like this:
>
>     getRowCells: function(tableElement, rowIndex) {
>          return $A($(tableElement).rows[rowIndex].cells);
>     },
>
> $A will take an iterable collection of elements, extend them, and
> return a prototype style array.  A lot of the problems you are finding
> are due to IE not allow the prototype of HTML elements to be extended,
> so you have to extend them "by hand".  From the Prototype docs:
>
> http://prototypejs.org/learn/extensions
>
> Because the prototype of the native browser object is extended, all
> DOM elements have Prototype extension methods built-in. This, however,
> isn't true for IE which doesn't let anyone touch
> HTMLElement.prototype. To make the previous example work in IE you
> would have to extend the element with Element.extend(). Don't worry,
> the method is smart enough not to extend an element more than once.
>
> On Apr 30, 2:49 pm, Mike van Lammeren <[EMAIL PROTECTED]> wrote:
>
> > OK, after incorporating Justin and Rob's comments, here's where things
> > stand:
>
> > var TableUtils = {
> >     /**
> >      * @param element a table element
> >      * @param integer the requested row
> >      * @return array an array of table cell elements (<th> or <td>
> > tags)
> >      **/
> >     getRowCells: function(tableElement, rowIndex) {
> >         tableElement = $(tableElement); // extend the table element
> >         var rowCells = [];
> >         var collectionCells = tableElement.rows[rowIndex].cells;
> >         for(var i = 0, len = collectionCells.length; i < len; ++i) {
> >             rowCells.push($(collectionCells[i]));
> >         }
> >         return rowCells;
> >     },
> >     /**
> >      * @param element a table element
> >      * @param integer the requested row
> >      * @return array an array of table cell elements (<th> or <td>
> > tags)
> >      **/
> >     getColumnCells: function(tableElement, columnId) {
> >         tableElement = $(tableElement); // extend the table element
> >         var columnCells = [];
> >         var tableRows = tableElement.rows;
> >         for(var i = 0, len = tableRows.length; i < len; ++i) {
> >             columnCells.push($(tableRows[i].cells[columnId]));
> >         }
> >         return columnCells;
> >     }
>
> > }
>
> > Element.addMethods('table', TableUtils);
>
> > I'm pretty happy with these methods now, but would welcome any other
> > suggestions.
>
> > On Apr 30, 3:02 pm, Mike van Lammeren <[EMAIL PROTECTED]> wrote:
>
> > > OK, I just fixed the IE 7 error by extending the cells as they are
> > > pushed onto the array:
>
> > >     getColumnCells: function(tableElement, columnId) {
> > >         tableElement = $(tableElement); // extend the table element
> > >         var rows = tableElement.rows;
> > >         var cells = [];
> > >         for (var i=0, len=rows.length; i<len; i++) {
> > >             cells.push($(rows[i].cells[columnId]));
> > >         }
> > >         return cells;
> > >     }
>
> > > On Apr 30, 3:00 pm, Mike van Lammeren <[EMAIL PROTECTED]> wrote:
>
> > > > Also, RobG's getColumnCells() function works great as a drop-in
> > > > replacement for my function, but only in Firefox. IE 7 shows a
> > > > javascript error in Prototype's Enumerable class.
>
> > > > On Apr 30, 2:51 pm, Mike van Lammeren <[EMAIL PROTECTED]> wrote:
>
> > > > > Thanks to Justin and RobG for your comments!
>
> > > > > To Justin: avoiding selecting every row in the table is a good idea,
> > > > > and should be a speed improvement.
>
> > > > > To RobG: Why traverse the DOM instead of using the collections? No
> > > > > good reason -- I just didn't know about the collections, that's all!
>
> > > > > I'm trying to incorporate both of your suggestions, but there is one
> > > > > problem I cannot solve. I'm unable to figure out how to extend the
> > > > > table collections, so that they recognize PrototypeJS methods.
>
> > > > > If we use RobG's suggestion for getRowCells(), then the pluck()
> > > > > method, for instance, is no longer recognized.
>
> > > > > I have made minor improvements to getRowCells(), and the PrototypeJS
> > > > > methods still work:
>
> > > > >     /**
> > > > >      * @param element a table element
> > > > >      * @param integer the requested row
> > > > >      * @return array an array of table cell elements (<th> or <td>
> > > > > tags)
> > > > >      **/
> > > > >     getRowCells: function(tableElement, rowId){
> > > > >         tableElement = $(tableElement); // extend the table element
> > > > >         var tableRow = tableElement.tBodies[0].rows[rowId];
> > > > >         if(tableRow)
> > > > >         {
> > > > >             return ($(tableRow).descendants()).findAll(function(el){
> > > > >                 return (el.tagName.toUpperCase() == 'TD' ||
> > > > > el.tagName.toUpperCase() == 'TH') ? true : false;
> > > > >             });
> > > > >         }
> > > > >         return [];
> > > > >     }
>
> > > > > On Apr 29, 8:40 pm, RobG <[EMAIL PROTECTED]> wrote:
>
> > > > > > On Apr 30, 9:13 am, Mike van Lammeren <[EMAIL PROTECTED]> wrote:
>
> > > > > > > Here are some handy extensions to select table rows and columns:
>
> > > > > > > var TableUtils = {
> > > > > > >     /**
> > > > > > >      * @param element a table element
> > > > > > >      * @param integer the requested row
> > > > > > >      * @return array an array of table cell elements
> > > > > > >      **/
> > > > > > >     getRowCells: function(tableElement, rowIndex){
> > > > > > >         tableElement = $(tableElement); // extend the table 
> > > > > > > element
> > > > > > >         var tableRows = tableElement.down().childElements();
> > > > > > >         if(tableRows[rowIndex])
> > > > > > >         {
> > > > > > >             return (tableRows[rowIndex]).descendants();
> > > > > > >         }
> > > > > > >         return [];
> > > > > > >     },
>
> > > > > > Why traverse the DOM when there are ready-to-use collections?
>
> > > > > >   getRowCells: function(tableElement, rowIndex) {
> > > > > >     return tableElement.rows[rowIndex].cells;
> > > > > >   }
>
> > > > > > >     /**
> > > > > > >      * @param element a table element
> > > > > > >      * @param integer the requested row
> > > > > > >      * @return array an array of table cell elements
> > > > > > >      **/
> > > > > > >     getColumnCells: function(tableElement, columnIndex){
> > > > > > >         tableElement = $(tableElement); // extend the table 
> > > > > > > element
> > > > > > >         var columnCells = [];
> > > > > > >         var tableRows = tableElement.down().childElements();
> > > > > > >         tableRows.each(function(trEl, index){ // loop over each 
> > > > > > > table
> > > > > > > row
> > > > > > >             var tCells = trEl.descendants(); // table cells in row
> > > > > > >             if(tCells[columnIndex])
> > > > > > >             {
> > > > > > >                 columnCells.push($(tCells[columnIndex])); // 
> > > > > > > extend
> > > > > > > each tableElement
> > > > > > >             }
> > > > > > >         });
> > > > > > >         return columnCells;
> > > > > > >     }}
>
> > > > > >   getColumnCells: function(tableElement, columnIndex) {
> > > > > >     var rows = tableElement.rows;
> > > > > >     var cells = [];
> > > > > >     for (var i=0, len=rows.length; i<len; i++) {
> > > > > >       cells.push(rows[i].cells[columnIndex]);
> > > > > >     }
> > > > > >     return cells;
> > > > > >   }
>
> > > > > > Incidentally, tableSection elements have a rows collection too, so
> > > > > > tableElement may not be the best choice of variable name.
>
> > > > > > --
> > > > > > Rob
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Spinoffs" group.
To post to this group, send email to rubyonrails-spinoffs@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to