heh, sorry but I've got another related problem where the onclick assignment doesn't seem to take to the element.
I have a function, and inside this function I have another function assigned to a var scoped variable name. This function creates and returns a <a> element with a <img> element appended inside it. The in the original function append the <a> element inside a <div> element. Here is some of the code: var deletef = function(id) { var deleteImg = document.createElement('img'); deleteImg.id = id; deleteImg.src = ''; deleteImg.alt = 'delete'; var deleteLink = document.createElement('a'); deleteLink.id = id; deleteLink.href = "javascript:;"; deleteLink.onClick = (function(id){ return function(){alert(id + " deleted...");} })(id); deleteLink.appendChild(deleteImg); return deleteLink; } I am then calling the function inside a appendChild function like so: div.appendChild(deletef(id)); Does any one see here why the onclick assignment doesn't seem to work? On May 16, 11:12 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote: > Thank you very much guys. Your suggestions worked for me. > > @ T.J. > You explanations were very insightful. I think that I understand > javascript a little better now, thank you. > > On May 16, 4:33 am, "T.J. Crowder" <[EMAIL PROTECTED]> wrote: > > > Hi, > > > Both Ken and kangax have answered the practical question you posed, > > but you're probably wondering why your code didn't work. :-) It's > > because in this line of code: > > > > item.onclick = function(){fc.selectArticle(id,headline);}; > > > ...you're assuming that 'id' and 'headline' become fixed at that point > > in time, that you're burning their *values* into the closure function > > (the onclick handler) at the point the function is defined. That's > > not how closures work. They work by giving the function enduring > > *access* to the things in scope where it's defined. So for instance: > > > function chatter() > > { > > var closures; > > var i; > > var msg; > > var closure; > > > closures = []; > > for (i = 1; i <= 5; ++i) > > { > > msg = "This is message #" + i; > > closures.push(function() { alert(msg); }); > > } > > > for (i = 0; i < closures.length; ++i) > > { > > closure = closures[i]; > > closure(); > > } > > > } > > > This *doesn't* show five alerts saying "This is message #1", "This is > > message #2", etc. It shows five alerts saying "This is message #5", > > because the functions access the 'msg' variable dynamically when > > they're *called*, and by the time they're called, msg is "This is > > message #5". This is incredibly powerful, but can be a bit surprising > > when you first look at it, especially when the closure lives on after > > the function returns and you think that the local vars have > > disappeared (they haven't, the closure preserves them). So this works > > the same way and has the same result: > > > function chatter() > > { > > var closures; > > > closures = createChatter(); > > doChatter(closures);} > > > function createChatter() > > { > > var closures; > > var i; > > var msg; > > > closures = []; > > for (i = 1; i <= 5; ++i) > > { > > msg = "This is message #" + i; > > closures.push(function() { alert(msg); }); > > } > > > return closures;} > > > function doChatter(closures) > > { > > var closures; > > var i; > > var closure; > > > for (i = 0; i < closures.length; ++i) > > { > > closure = closures[i]; > > closure(); > > } > > > } > > > Note that the 'msg' variable lives even though createChatter() has > > returned; each closure keeps a reference to the scope where it was > > defined, and so that scope is preserved in memory even when it would > > have been released if there were no closures involved. (The other > > local vars to createChatter() also live on; but nothing uses them, so > > that's just wasted space.) > > > More on closures in my blog (which sadly I haven't had time to post to > > lately):http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.ht... > > > This post may also be > > useful:http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html > > ...as you have an implicit global variable 'i' in your code which you > > almost certainly intended to be local to your "result" function. ;-) > > > Hope this helps, > > -- > > T.J. Crowder > > tj / crowder software / com > > > On May 15, 10:57 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> > > wrote: > > > > Hi all, > > > I am having trouble with my variable assignments always becoming the > > > last variable inside my loop. > > > > var populateAvailableContent = Class.create(methodCall, { > > > initialize: function($super, name, message) { > > > $super(name,'getAllContent','Loading...') > > > }, > > > result: function(ret) { > > > var div = $('articles'); > > > div.innerHTML = null; > > > var rowCount = ret.getRowCount(); > > > for (i=0;i<rowCount;i++) { > > > var item = > > > document.createElement('div'); > > > var id = ret.id[i] > > > var headline = ret.headline[i]; > > > var html = headline + "<hr />"; > > > item.id = "item"; > > > item.onclick = > > > function(){fc.selectArticle(id,headline);}; > > > item.innerHTML = html; > > > div.appendChild(item); > > > } > > > } > > > }) > > > > In this scenario, id and headline are always becomes the last value in > > > the loop and that is what is passed in the fc.selectArticle() > > > function. I've tried a few different possible solutions I've found on > > > the web, but none seemed to work. I decided to try and give the bind() > > > function a go around but I can't seem to figure out how to use it in > > > my situation. > > > > Any help would be greatly appreciated. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---