I am successfully using Prototype replace() to dynamically replace a select picker with a text field when the user chooses Add new... from the bottom of the list. The behavior I would like to add to this is to restore the original picker if the user blurs away from this new field. From the API docs, the replace function is said to return a reference to the object that was removed. Does this reference include all of the original content? Here''s what I''ve tried: if($(''o_s'')){ var picker; Event.observe(''o_s'',''change'',function(e){ if($F(''o_s'') == ''Add new.''){ if(picker = $(''o_s'').replace(''<input type="text" id="o_s" name="o_s" value="" />'')){ $(''o_s'').focus(); Event.observe(''o_s'',''blur'',function(e){ if($F(''o_s'') == ''''){ $(''o_s'').replace(picker) } }); } } }); } I expect the newly-created text field to disappear when I leave it empty and blur away from it. Instead, I see [object HTMLSelectElement] appear AFTER the text field, not replacing it at all. I''ve tried replacing the bare object reference with picker.nodeValue, but that just gets me an error. Replace() needs an HTML string with the replacement content, but I don''t know how to get that out of the object. I can almost understand why this is happening, but it''s not clear how to work around it. Any suggestions? Thanks, Walter --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-spinoffs-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs?hl=en -~----------~----~----~----~------~----~------~--~---
Talking to myself here. I managed to work it out, but the number of lines of code convince me that I am swimming upstream here. Any recommendations for streamlining would be graciously accepted. The following works, in a hackish sort of way: var combo_box = function(e){ var picker = $(''o_s'').innerHTML; if($F(''o_s'') = ''Add new...''){ if($(''o_s'').replace(''<input type="text" id="o_s" name="o_s" value="" />'')){ $(''o_s'').focus(); Event.observe(''o_s'',''blur'',function(e){ txt = Event.element(e); if(txt.value = ''''){ new Insertion.After(''o_s'',''<select id="o_s" name="o_s" size="1">'' + picker + ''</select>''); Event.observe(''o_s'',''change'',combo_box); txt.remove(); } }); } } } //inside an Event.observe(window...) call: if($(''o_s'')){ Event.observe(''o_s'',''change'',combo_box); } Thanks, Walter On Jul 6, 2007, at 1:54 PM, Walter Lee Davis wrote:> > I am successfully using Prototype replace() to dynamically replace a > select picker with a text field when the user chooses Add new... from > the bottom of the list. The behavior I would like to add to this is to > restore the original picker if the user blurs away from this new field. > > From the API docs, the replace function is said to return a reference > to the object that was removed. Does this reference include all of the > original content? > > Here''s what I''ve tried: > > if($(''o_s'')){ > var picker; > Event.observe(''o_s'',''change'',function(e){ > if($F(''o_s'') == ''Add new.''){ > if(picker = $(''o_s'').replace(''<input type="text" id="o_s" name="o_s" > value="" />'')){ > $(''o_s'').focus(); > Event.observe(''o_s'',''blur'',function(e){ > if($F(''o_s'') == ''''){ > $(''o_s'').replace(picker) > } > }); > } > } > }); > } > > I expect the newly-created text field to disappear when I leave it > empty and blur away from it. Instead, I see [object HTMLSelectElement] > appear AFTER the text field, not replacing it at all. I''ve tried > replacing the bare object reference with picker.nodeValue, but that > just gets me an error. Replace() needs an HTML string with the > replacement content, but I don''t know how to get that out of the > object. > > I can almost understand why this is happening, but it''s not clear how > to work around it. > > Any suggestions? > > Thanks, > > Walter > > > >--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-spinoffs-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs?hl=en -~----------~----~----~----~------~----~------~--~---
Further echoes -- the following does not work in Safari... On Jul 6, 2007, at 3:11 PM, Walter Lee Davis wrote:> > Talking to myself here. I managed to work it out, but the number of > lines of code convince me that I am swimming upstream here. Any > recommendations for streamlining would be graciously accepted. > > The following works, in a hackish sort of way: > > var combo_box = function(e){ > var picker = $(''o_s'').innerHTML; > if($F(''o_s'') = ''Add new...''){ > if($(''o_s'').replace(''<input type="text" id="o_s" name="o_s" value="" > />'')){ > $(''o_s'').focus(); > Event.observe(''o_s'',''blur'',function(e){ > txt = Event.element(e); > if(txt.value = ''''){ > new Insertion.After(''o_s'',''<select id="o_s" name="o_s" size="1">'' > + picker + ''</select>''); > Event.observe(''o_s'',''change'',combo_box); > txt.remove(); > } > }); > } > } > } > //inside an Event.observe(window...) call: > if($(''o_s'')){ > Event.observe(''o_s'',''change'',combo_box); > } > > Thanks, > > Walter > > On Jul 6, 2007, at 1:54 PM, Walter Lee Davis wrote: > >> >> I am successfully using Prototype replace() to dynamically replace a >> select picker with a text field when the user chooses Add new... from >> the bottom of the list. The behavior I would like to add to this is to >> restore the original picker if the user blurs away from this new >> field. >> >> From the API docs, the replace function is said to return a reference >> to the object that was removed. Does this reference include all of the >> original content? >> >> Here''s what I''ve tried: >> >> if($(''o_s'')){ >> var picker; >> Event.observe(''o_s'',''change'',function(e){ >> if($F(''o_s'') == ''Add new.''){ >> if(picker = $(''o_s'').replace(''<input type="text" id="o_s" >> name="o_s" >> value="" />'')){ >> $(''o_s'').focus(); >> Event.observe(''o_s'',''blur'',function(e){ >> if($F(''o_s'') == ''''){ >> $(''o_s'').replace(picker) >> } >> }); >> } >> } >> }); >> } >> >> I expect the newly-created text field to disappear when I leave it >> empty and blur away from it. Instead, I see [object HTMLSelectElement] >> appear AFTER the text field, not replacing it at all. I''ve tried >> replacing the bare object reference with picker.nodeValue, but that >> just gets me an error. Replace() needs an HTML string with the >> replacement content, but I don''t know how to get that out of the >> object. >> >> I can almost understand why this is happening, but it''s not clear how >> to work around it. >> >> Any suggestions? >> >> Thanks, >> >> Walter >> >> >>> > > > >--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-spinoffs-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs?hl=en -~----------~----~----~----~------~----~------~--~---