Fehlermeldung "is not a function"

BlubBlub

Mitglied
Der Code sieht zwar nach viel aus ist aber einfach und schnell nachzuvollziehen.
Der erste Code funktioniert sehr gut.

Der zweite Code funktioniert nur eingeschränkt und zwar nur wenn ich die alerts
"alert('in jQueryLoadTest 3/6')" und "alert('in jQueryLoadTest 5/6');" drin lasse.
Habe ich keinen alert Aufruf drin so erhalte ich bei Firefox in der Fehlerkonsole die Fehlermeldung: "this.bootstrapJQueryUi is not a function".
Habe ich nur "alert('in jQueryLoadTest 3/6')" drin so erhalte ich die
Fehlermeldung: "this.createUI is not a function".

Woran liegt das was muss ich tun damit der zweite Code auch ohne den beiden alerts funktioniert?

minBookmarklet.js (Variante 1 funktioniert)
HTML:
//"class" MinBook
function MinBook()
{
	this.init();
}

MinBook.prototype.htmlStr = '';
MinBook.prototype.textMarked = '';
MinBook.prototype.picturesMarked = '';
MinBook.prototype.jQueryScriptSrc = '../js/jquery-1.5.1.min.js';
MinBook.prototype.jQueryUIScriptSrc = '../js/jquery-ui-1.8.10.custom.min.js';
MinBook.prototype.jQueryUICSSLinkHref = ../jquery-ui-1.8.10.custom.css';

/*--------------------------------------------------------------------------------------------------------------	
	Method: init()
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.init = function(){
	this.bootstrapJQuery();
}

/*--------------------------------------------------------------------------------------------------------------	
	Method: bootstrapJQuery()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.bootstrapJQuery = function(){	
	this.jQueryLoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.jQueryLoadTest = function(){
	this.bootstrapJQueryUI();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: bootstrapJQueryUI()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.bootstrapJQueryUI = function(){
	this.jQueryUILoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.jQueryUILoadTest = function(){	
	this.createUI();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: createUI()		
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.createUI = function(){
	alert('in createUI 6/6');
}

/*********************************************************************************************************************************************
 *												 Invoke						 															     *
 *********************************************************************************************************************************************/
var myMinBook = new MinBook();

minBookmarklet.js (Variante 2 funktioniert NICHT)
HTML:
//"class" MinBook
function MinBook()
{
	this.init();
}

MinBook.prototype.htmlStr = '';
MinBook.prototype.textMarked = '';
MinBook.prototype.picturesMarked = '';
MinBook.prototype.jQueryScriptSrc = '../js/jquery-1.5.1.min.js';
MinBook.prototype.jQueryUIScriptSrc = '..l/js/jquery-ui-1.8.10.custom.min.js';
MinBook.prototype.jQueryUICSSLinkHref = ../jquery-ui-1.8.10.custom.css';

/*--------------------------------------------------------------------------------------------------------------	
	Method: init()
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.init = function(){
	//alert('in init 1/6');
	this.bootstrapJQuery();
}

/*--------------------------------------------------------------------------------------------------------------	
	Method: bootstrapJQuery()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.bootstrapJQuery = function(){
	//alert('in bootstrapJQuery 2/6');	
	
	if( (typeof(jQuery) == 'undefined')|| (jQuery.fn.jquery != '1.5.1') ) 
	{	
		//jQuery javascript
		var jQueryScript = document.createElement("script");
		jQueryScript.type = "text/javascript";
		jQueryScript.src= this.jQueryScriptSrc;
		document.getElementsByTagName("head")[0].appendChild(jQueryScript);
	} 
	this.jQueryLoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.jQueryLoadTest = function(){
	alert('in jQueryLoadTest 3/6');
	
    if(typeof(jQuery) == 'undefined')
        window.setTimeout(this.jQueryLoadTest,100);
    else this.bootstrapJQueryUI();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: bootstrapJQueryUI()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.bootstrapJQueryUI = function(){
	//alert('in bootstrapJQueryUI 4/6');
	
	//jQuery UI javascript	  
	var jQueryUIScript = document.createElement("script");
    jQueryUIScript.type = "text/javascript";
	jQueryUIScript.src= this.jQueryUIScriptSrc;
	document.getElementsByTagName("head")[0].appendChild(jQueryUIScript);
	 
	//jQuery-ui stylesheet
	var jQueryUICSSLink = document.createElement("link");
	jQueryUICSSLink.type = "text/css";
	jQueryUICSSLink.rel = "stylesheet";
	jQueryUICSSLink.href = this.jQueryUICSSLinkHref;
	document.getElementsByTagName("head")[0].appendChild(jQueryUICSSLink);

	this.jQueryUILoadTest();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: jQueryLoadTest()			
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.jQueryUILoadTest = function(){	
	alert('in jQueryUILoadTest 5/6');
	
    if(typeof(jQuery.ui) == 'undefined')
        window.setTimeout(this.jQueryUILoadTest,100);
    else this.createUI();
}


/*--------------------------------------------------------------------------------------------------------------	
	Method: createUI()		
---------------------------------------------------------------------------------------------------------------*/
MinBook.prototype.createUI = function(){
	//alert('in createUI 6/6');
	
	alert("jQuery.ui: " + jQuery.ui);
	alert("jQuery.ui.version: " + jQuery.ui.version);
	alert("jQuery.fn.jquery: " + jQuery.fn.jquery);
	
	jQuery('body').append('<div id="Mydiv"></div>');
	
	jQuery(document).ready(function(){			
		jQuery('#Mydiv').dialog({
			title: 'My Dialog',
			position: [10,10],
			resizable: false,
			width: 515,
			close: function() 
				   {
						window.location.reload();
				   }
		});
	});
}

/*********************************************************************************************************************************************
 *												 Invoke						 															     *
 *********************************************************************************************************************************************/
var myMinBook = new MinBook();

BookmarkletCode
HTML:
javascript:
(
	function()
	{
		var x =document.createElement('SCRIPT');
		x.type='text/javascript';
		x.src='../minBookmarklet.js';
		document.getElementsByTagName('head')[0].appendChild(x);
	}
)();
 
Hi,

this bezieht sich innerhalb der Methode setTimeout auf den Kontext, in dem diese aufgerufen wird - und das ist window. Dort existiert keine Funktion mit dem Namen jQueryLoadTest. Um auf die Instanz deiner Klasse zugreifen zu können, musst du die this-Referenz "closuren".

Weiterhin musst ein gültiger Funktionsaufruf erfolgen.
Code:
MinBook.prototype.jQueryLoadTest = function(){
  // closuren
  var _this = this;

    if(typeof(jQuery) == 'undefined')
        window.setTimeout(function(){_this.jQueryLoadTest();},100);
    else this.bootstrapJQueryUI();
}
Weiterhin fehlt bei der Zuweisung des CSS-Filestrings das öffnende Anführungszeichen.

Ciao
Quaese
 
Zurück