Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    Oggetto (protoype) che non viene trovato

    Salve!
    Ho un problema con una libreria che sto costruendo, ovvero la libreria pur essendo perfettamente visibile alla pagina html di prova, non trova un elemento collegato.
    Questo il codice definito:
    codice:
    var $ = function(){};	//	Oggetto vuoto e pronto per la modifica.
    var elements = [];	//	Utilizzata per concatenare più oggetti.
    /**
    *	Prende l'IDentificativo dell'elemento in oggetto (funzione cross browser)
    *		Uso: var e = $.Element.get('pippo').value; Se 'pippo' è un controllo tipo INPUT, in value c'è il suo valore
    */
    $.prototype.Element = {
    
    	/**
    	*	Metodo: cache
    			Mette nella cache un elemento DOM (metodo privato di get: vedi sotto)
    			Argomenti:
    			    - [string] id : l'id dell'elemento desiderato
    	*/
    	cache: function(id) {		
    			if(!elements[id]) {
    				if (document.getElementById) {	// 	Mozilla + IE6/7/8/9
    					elements[id] = document.getElementById(id);
    				} else if (document.all) {	//	IE4
    					elements[id] = document.all[id];
    				} else if (document.layers) {	// 	Netscape 4
    					elements[id] = document.layers[id];
    				}
    			}
    	return elements[id];
    	},	//	cache()
    	
    	/**
    	*       Metodo: get
    	        Restituisce un elemento DOM basandosi sull'id dello stesso
    	        Argomenti:
    	            - [string] id : l'id dell'elemento desiderato
    				
    			Esempio d'uso: var valore = $.Element.get('pippo').value;
    	*/
    	get: function(id) {
    		var e = false;
    		if (typeof id == 'string') {	//	Se l'ID è una stringa lo processo
    			e = cache(id);
    		}
    	return e;
    	}	//	get()
    };	//	Element
    In pratica richiamando per prova la funzione get() mi da come errore: Uncaught TypeError: Cannot call method 'get' of undefined (in Chrome).
    Ho provato e riprovato a guardare se ci fossero errori di sintassi nel codice ma non ne vedo.
    La funzione la richiamo in modo semplice così da fornirmi il colore di sfondo di un elemento HTML che ho creato appositamente, tanto per vedere se funziona.
    codice:
    alert('Colore: ' + $.Element.get('prova').style.backgroundColor);
    Qualcuno saprebbe aiutarmi a trovare l'errore, io proprio non ci riesco

  2. #2
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Intanto la parola "get" è una parola riservata di javascript e ti conviene non usarla (https://developer.mozilla.org/en/Jav.../Operators/get). Fossi in te proverei con un altro nome.
    Poi devi scegliere: o la funzione $ è un costruttore e allora è corretto che usi oggettoFiglio.prototype.Element, oppure è un oggetto con proprietà e allora devi usare solo $.Element.

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Avevo già provato ad usare un altro nome e mi dava lo stesso errore, dato che non funzionava sono tornato al nome che mi piaceva di più e che avevo già usato con successo in un altro progetto.
    Insomma non è un errore di sintassi ma proprio non lo vede!
    E infatti se vedi l'esempio è la seconda $.Element.get() che però non vede.

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    In realtà la vecchia funzione è questa:
    codice:
    var elements = [];
    var element = {
    	/*
    	        Metodo: cache
    	        Mette nella cache un elemento DOM (metodo privato)
    	        Argomenti:
    	            - [string] id : l'id dell'elemento desiderato
    	*/
    	cache: function(id) {
    		//if (typeof element == 'string') {
    			if(!elements[id]) {
    				//elements[id] = document.getElementById(id);
    				if (document.getElementById) {	// 	Mozilla + IE6/7
    					elements[id] = document.getElementById(id);
    				} else if (document.all) {	//	IE4
    					elements[id] = document.all[id];
    				} else if (document.layers) {	// 	Netscape 4
    					elements[id] = document.layers[id];
    				}
    			}
    		//}
        return elements[id];
        },	//	cache()
    	
    	/*
    	        Metodo: get
    	        Restituisce un elemento DOM basandosi sull'id dello stesso
    	        Argomenti:
    	            - [string] id : l'id dell'elemento desiderato
    				
    			Esempio d'uso: var valore = element.get('pippo').value;
    	*/
    	get: function(id) {
    	return element.cache(id);
    	}	//	get()	
    }
    che funziona benissimo ma non è prototipata, ovvero tutti gli altri metodi (che non metto per semplicità) sono costruiti dentro l'oggetto element, a me andava di renderla modulare in modo da caricare a run time solo gli oggetti che usavo davvero e di farlo appunto con prototype, ma mi da quello strano errore, mentre in questa che ho messo qui funziona benissimo.

  5. #5
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Originariamente inviato da carlomarx
    Poi devi scegliere: o la funzione $ è un costruttore e allora è corretto che usi oggettoFiglio.prototype.Element, oppure è un oggetto con proprietà e allora devi usare solo $.Element.
    Mi spiego meglio:

    codice:
    var oggetto = new $();
    alert('Colore: ' + oggetto.prototype.Element.get('prova').style.backgroundColor);
    oppure:

    codice:
    var oggetto = new $();
    alert('Colore: ' + oggetto.Element.get('prova').style.backgroundColor);
    Ma la tua non funzionerà mai.

  6. #6
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Non ho nessuna intenzione di creare un nuovo oggetto, ma di usarla come usavo l'altra, cioè semplicemente richiamando il metodo corrispondente.

  7. #7
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Non ha senso quello che dici. L'uso dei prototipi serve a creare tanti oggetti completamente o parzialmente uguali tra loro. Se devi creare un solo oggetto allora NON DEVI USARE I PROTOTIPI.

  8. #8
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Originariamente inviato da Marcolino's
    […] a me andava di renderla modulare in modo da caricare a run time solo gli oggetti che usavo davvero e di farlo appunto con prototype, ma mi da quello strano errore, mentre in questa che ho messo qui funziona benissimo.
    Adesso ho capito qual è il tuo problema. Devi fare così per tutte le proprietà:

    codice:
    var $ = {};	//	Oggetto vuoto e pronto per la modifica.
    var elements = [];	//	Utilizzata per concatenare più oggetti.
    /**
    *	Prende l'IDentificativo dell'elemento in oggetto (funzione cross browser)
    *		Uso: var e = $.Element.get('pippo').value; Se 'pippo' è un controllo tipo INPUT, in value c'è il suo valore
    */
    // carico il primo modulo
    $.Element = {
    
    	/**
    	*	Metodo: cache
    			Mette nella cache un elemento DOM (metodo privato di get: vedi sotto)
    			Argomenti:
    			    - [string] id : l'id dell'elemento desiderato
    	*/
    	cache: function(id) {		
    			if(!elements[id]) {
    				if (document.getElementById) {	// 	Mozilla + IE6/7/8/9
    					elements[id] = document.getElementById(id);
    				} else if (document.all) {	//	IE4
    					elements[id] = document.all[id];
    				} else if (document.layers) {	// 	Netscape 4
    					elements[id] = document.layers[id];
    				}
    			}
    	return elements[id];
    	},	//	cache()
    	
    	/**
    	*       Metodo: get
    	        Restituisce un elemento DOM basandosi sull'id dello stesso
    	        Argomenti:
    	            - [string] id : l'id dell'elemento desiderato
    				
    			Esempio d'uso: var valore = $.Element.get('pippo').value;
    	*/
    	get: function(id) {
    		var e = false;
    		if (typeof id == 'string') {	//	Se l'ID è una stringa lo processo
    			e = cache(id);
    		}
    	return e;
    	}	//	get()
    };	//	Element
    Vedrai che così ti funzionerà. Spero che tu abbia capito a cosa servono i prototipi…

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.