John there is something wrong here. First of all it is not possible that that function is called twice in a call because that "done" variable is not ambiguous at all.
Secondly I do not think that onload should be messed up with onreadystatechange. onload is the only event we would use except some browser which does not fire it as expected. In these browsers a readyState check makes sense only inside an onreadystatechange event. If the script has not a parent anymore and that operation is performed twice I bet there is something wrong in the included script. It is probably modifying the DOM and scripts elements, that is why there is a problem. If that script for some reason has been moved or adopted the head.removeChild(script) will fail because the script will have a parentNode but it is not necessary that head. This is possible only because that operation is performed after success/complete and as soon as the script is evaluated by the browser. I wonder if this piece of code could solve every current or future problem with that step: // Handle Script loading if ( !jsonp ) { var onload = script.onload = function(){ onload = script.onload = script.onreadystatechange = null; success(); complete(); if(script.parentNode) script.parentNode.removeChild(script); } ; script.onreadystatechange = function(){ // this is an onreadystatechange problem, not an onload one if(/^(loaded|complete)$/.test(this.readyState)) onload(); }; } The onload variable is because in some browser ( not sure it is only with iframes ) you cannot call el.onload directly. Let me know what you think. Regards On Wed, Jul 22, 2009 at 3:48 PM, John Resig <jere...@gmail.com> wrote: > It's an easy enough change. I filed a bug and fixed it: > http://dev.jquery.com/ticket/4934 > > --John > > > > On Tue, Jul 21, 2009 at 12:38 PM, vickyb <vicky.ble...@gmail.com> wrote: > >> >> Hello, >> >> I should start by saying I am fairly new to JQuery so please bear with >> me, but I would like to share a scenario with you all in the hope >> someone can offer some clarity. >> >> In this example, a user requests an external JavaScript file using >> jquery GET: >> >> >> -------------------------------------------------------------------------------------// >> START >> >> $.ajax({ type: "GET", url: "***URL here***", >> >> >> -------------------------------------------------------------------------------------// >> END >> >> The requested JavaScript file performs several dynamic scripting >> functions (adding script elements to the document head) and then >> deletes itself purely to clean up the page source: >> >> >> -------------------------------------------------------------------------------------// >> START >> >> //Locate the current script node >> var scripts = document.getElementsByTagName('script'); >> >> var currentScript = scripts[scripts.length - 1]; >> >> //Set an id of the current script node if null >> currentScript.id = ((currentScript.id.length == 0 ) ? >> "scriptToDelete" : currentScript.id ); >> >> //***REST OF CODE HERE >> document.getElementById(currentScript.id).parentNode.removeChild >> (document.getElementById(currentScript.id)); >> >> >> -------------------------------------------------------------------------------------// >> END >> >> In the event this file is called directly within a page (<script >> src=""></script>) the DOM tree is manipulated effectively and the >> 'currentScript' node is deleted. However in this example, due to >> maintenance code also in the JQuery library (below) this script node >> is deleted twice resulting in the 'Node not found error': >> >> line 3494 // Handle memory leak in IE >> line 3495 script.onload = script.onreadystatechange = null; >> line 3496 head.removeChild( script ); ***conflicting code >> >> As the method of calling this external file isn't guaranteed (and thus >> it would be beneficial to leave this maintenance code in the external >> file), is it fair to assume both files (the external JS file, and the >> JQuery library) should perform a last minute check of 'does the parent >> node have this child node' before attempting this deletion? >> >> Or have I missed something? >> >> I look forward to your responses! >> >> Thanks. >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-dev@googlegroups.com To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---