Very cool! A quick test took 5 seconds to build 500 tables with 4 cells each. I guess that's reasonable, but could be better.
Jon L. wrote: > In theory (at least), couldn't it be simplified to something like: > > var $E = function (/** tag, attr, child0, ..., childN **/) { > var args = $A(arguments); > var element = new Element(args.shift(), args.shift()); > args.each(element.appendChild.bind(element)); > return element; > }; > > No idea whether it helps with performance. > But, at minimal, it removes the anonymous function. > > - Jon L. > > On Tue, May 6, 2008 at 6:03 PM, Erik R. <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>> wrote: > > > Sure. An old-school for loop is probably more efficient. But most of > the Enumerable methods already use each() with an anonymous function > anyway, so presumably they could be further optimized as well. I was > just sticking with the prototype.js style. > > On May 7, 12:43 am, Hector Virgen <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>> wrote: > > Maybe this can be optimized a little bit? I'm not sure if this > helps, > > but it doesn't use any anonymous functions. > > > > var $E = function(tagName, attributes, childrenVarArgs) > > { > > var element = new Element(tagName, attributes); > > if (arguments.length < 3) return element; > > var args = $(arguments).flatten(); > > var size = args.size(); > > for (var i = 1; i <= size; i++) { > > element.appendChild(args.indexOf(i)); > > } > > return element; > > > > }; > > kangax wrote: > > > So for every single one of those cells (that $E is called) > there is a > > > "new Element" instantiation and 2 enumerable methods (that are > being > > > called recursively) : ) > > > Why not just use string interpolation? > > > > > - kangax > > > > > On May 6, 5:43 pm, "Erik R." <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>> wrote: > > > > >> I was thinking "Element", but now that you mention it, "Erik" > makes > > >> more sense. :-) > > > > >> On May 6, 11:36 pm, Hector Virgen <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>> wrote: > > > > >>> Very nice! Is $E() short for Erik? :) > > > > >>> Erik R. wrote: > > > > >>>> Recently I've been using prototype's wonderful new DOM creation > > >>>> syntax. But I found that it's still too verbose. Say I > want to > > >>>> create the following table: > > > > >>>> <table id="myTable"> > > >>>> <thead> > > >>>> <tr> > > >>>> <th>Title A</th> > > >>>> <th>Title B</th> > > >>>> </tr> > > >>>> </thead> > > >>>> <tbody> > > >>>> <tr> > > >>>> <td>A</td> > > >>>> <td>B</td> > > >>>> </tr> > > >>>> </tbody> > > >>>> </table> > > > > >>>> Simple, right? But, as I understand the prototype.js DOM > building, to > > >>>> build this table, I'd have to do: > > > > >>>> var table = new Element('table', {id:myTable}); > > >>>> var thead = new Element('thead'); > > >>>> table.appendChild(thead); > > >>>> var theadRow = new Element('tr'); > > >>>> thead.appendChild(theadRow); > > >>>> theadRow.appendChild(new Element('th').update('Title A')); > > >>>> theadRow.appendChild(new Element('th').update('Title B')); > > >>>> var tbody = new Element('tbody'); > > >>>> table.appendChild(tbody); > > >>>> var tbodyRow = new Element('tr'); > > >>>> tbody.appendChild(tbodyRow); > > >>>> tbodyRow.appendChild(new Element('td').update('A')); > > >>>> tbodyRow.appendChild(new Element('td').update('B')); > > > > >>>> Grossly verbose, I think you'll agree. Particularly, it's > the saving > > >>>> of the local variables that bothers me. > > > > >>>> But what if we had a shortcut function? Just like $() is > short for > > >>>> document.getElementById(), I think we could benefit from a > shortcut > > >>>> element function. So I've written one: $E. > > > > >>>> var $E = function(tagName, attributes, childrenVarArgs) > > >>>> { > > >>>> var element = new Element(tagName, attributes); > > >>>> $A(arguments).flatten().each(function(child, i) > > >>>> { > > >>>> if (i > 1 && child) > > >>>> element.appendChild(child); > > >>>> }); > > >>>> return element; > > >>>> }; > > > > >>>> It takes the tagName and attributes just like the Element > constructor, > > >>>> but it will also take other arguments that will be appended as > > >>>> children. Look at the new code to create that same table: > > > > >>>> var table = $E('table', {id:myTable}, > > >>>> $E('thead', null, > > >>>> $E('tr', null, > > >>>> $E('th').update('Title A'), > > >>>> $E('th').update('Title B'))), > > >>>> $E('tbody', null, > > >>>> $E('tr', null, > > >>>> $E('td').update('Title A'), > > >>>> $E('td').update('Title B')))); > > > > >>>> A little nicer, don't you think? Some intelligent argument > parsing > > >>>> might also be added to get rid of those null attribute > parameters. > > > > >>>> Anyway, I'm submitting this as a suggestion to be > incorporated into > > >>>> the next release of prototype.js. Let me know what you think. > > > > >>>> Cheers, > > >>>> Erik > > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---