Trotz remove() Dateien weiterhin im vorhanden

BlubBlub

Mitglied
Der Code sieht zwar nach viel aus, wichtig ist aber nur die Funktion createUI() ganz unten, den Rest hab ich nur eingefügt, damit der Kontext ersichtlich ist.

Bookmarklet
Code:
javascript:
(
	function()
	{
		if(typeof(window.minBook) == 'undefined')
		{
			var x = document.createElement('SCRIPT');
			x.type='text/javascript';
			x.src='../minBookmarklet.js';
			document.getElementsByTagName('head')[0].appendChild(x);
		}
		else
		{
	
			alert('First please close the open minBookmarklet');
		}
	}
)();

minBookmarklet.js
Code:
//"class" minBook
function minBook()
{
	minBook.init = init;
	minBook.bootstrapJQuery = bootstrapJQuery;
	minBook.jQueryLoadTest = jQueryLoadTest;
	minBook.bootstrapJQueryUI = bootstrapJQueryUI;
	minBook.jQueryUILoadTest = jQueryUILoadTest;
	minBook.createUI = createUI;
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: init()
---------------------------------------------------------------------------------------------------------------*/
function init()
{
	minBook.bootstrapJQuery();
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: bootstrapJQuery()			
---------------------------------------------------------------------------------------------------------------*/
function bootstrapJQuery()
{	
	if( (typeof(jQuery) == 'undefined')|| (jQuery.fn.jquery != '1.5.1') ) 
	{	
		//jQuery javascript
		var jQueryScript = document.createElement("script");
		jQueryScript.type = "text/javascript";
		jQueryScript.src= "../jquery-1.5.1.min.js";
		document.getElementsByTagName("head")[0].appendChild(jQueryScript);
	} 
		
	minBook.jQueryLoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
function jQueryLoadTest()
{
    if(typeof(jQuery) == 'undefined')
        window.setTimeout(minBook.jQueryLoadTest,100);
    else minBook.bootstrapJQueryUI();
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: bootstrapJQueryUI()			
---------------------------------------------------------------------------------------------------------------*/
function bootstrapJQueryUI()
{	
	//jQuery UI javascript	  
	var jQueryUIScript = document.createElement("script");
    jQueryUIScript.type = "text/javascript";
	jQueryUIScript.src= "../jquery-ui-1.8.10.custom.min.js";
	document.getElementsByTagName("head")[0].appendChild(jQueryUIScript);
	 
	//jQuery-ui stylesheet
	var jQueryUICSSLink = document.createElement("link");
	jQueryUICSSLink.type = "text/css";
	jQueryUICSSLink.rel = "stylesheet";
	jQueryUICSSLink.href = "../jquery-ui-1.8.10.custom.css";
	document.getElementsByTagName("head")[0].appendChild(jQueryUICSSLink);

	minBook.jQueryUILoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
function jQueryUILoadTest()
{
    if(typeof(jQuery.ui) == 'undefined')
        window.setTimeout(minBook.jQueryUILoadTest,100);
    else minBook.createUI();
	
}


/*--------------------------------------------------------------------------------------------------------------	
	Function: createUI()		
---------------------------------------------------------------------------------------------------------------*/
function createUI()
{
	var dialogContent = jQuery('<div id="Mydiv" style="background-color:yellow;">hello World</div>');
	
	jQuery(document).ready(function(){			
		jQuery(dialogContent).dialog({
			title: 'My Dialog',
			position: [10,10],
			resizable: false,
			width: 515,
			close: function() 
				   {
						unloadScripts();
				   }
		});
	});
}


function unloadScripts()
{
	var HtmlCode = $('html');
	$('[src^=../jquery-1.5.1.min.js"]', HtmlCode).remove();
	$('[src^="../jquery-ui-1.8.10.custom.min.js"]', HtmlCode).remove();
	$('[href^="../jquery-ui-1.8.10.custom.css"]', HtmlCode).remove();
	$('[src^="../minBookmarklet.js"]', HtmlCode).remove();
}

/*********************************************************************************************************************************************
 *												 Invoke						 															     *
 *********************************************************************************************************************************************/
new minBook();						
minBook.init();


Zunächst geht man auf eine Internetseite und dann ruft man das Bookmarklet auf. Dadurch wird minBookmarklet.js in die Seite integrierd und ein jQuery Dialog öffnet sich. Zudem werden noch die folgenden Dateien nachgeladen:
- jquery-1.5.1.min.js
- jquery-ui-1.8.10.custom.min.js
- jquery-ui-1.8.10.custom.css

Wenn ich nun den jQuerry Dialog schließe wird die Funktion unloadScripts aufgerufen.
Diese entfernt dann alle Integrierten Dateien.
In Firebug sieht man auch dass im <head> tag alle integrierten Dateien weg sind.
Doch wenn ich nun erneut auf das Bookmarklet klicke steht da "First please close the open minBookmarklet" was ja der else Zwei meines Bookmarklet ist, der nur aufgerufen wird wenn ein minBook Objekt bereits exisitert. Nur versteh ich nicht wieso, weil ich doch alle Dateien mit remove entfernt habe.
 
Nur weil du die Tags aus deinem Dokument entfernst, macht das noch lange nicht alles rückgängig, was diese Skripts gemacht haben (wie soll das gehen?). window.minBook ist also weiterhin gesetzt. Füge deiner unloadScripts Funktion noch folgende Zeile am Ende hinzu, um die Eigenschaft wirklich vom window Objekt zu entfernen.

Javascript:
delete window.minBook;

Edit: Du solltest auch lieber eine Referenz auf die erzeugten Skripts behalten, anstatt Sie mit dem Selektor zu suchen und zu entfernen.
Was ist, wenn die Seite bereits jQuery drin hat? Da löschst du am Ende auch das ursprüngliche Skript und die Host Seite funktioniert womöglich nicht mehr! Also merk dir die Referenzen auf deine erzeugten Skript- und Link-Tags.
 
Zuletzt bearbeitet:
Das mit dem delete funktioniert aus irgendeinem Grunde nicht. Das Objekt ist weierhin im DOM enthalten. Es wird also auch weiterhin der else Zweig des Bookmarklets ausgeführt.
 
Zurück