Un if ed una funzione nell'onchange

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno a tutti,

ho la necessità d'inserire un if ed una funzione nell'attributo onchange di una select.
So che due funzioni s'inseriscono in questa maniera:

HTML:
<select name="prova" onchange="funzione1(); funzione2()")

ma non riesco a mettere l'if + la funzione


if:


HTML:
if(this.options.selectedIndex!=0 && document.getElementById('quantita').options.selectedIndex!=0){calcola(this, document.getElementById('quantita'))}


Funzione:


HTML:
set_modello();

Come si fa?
Grazie,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao,
puoi usare una sintassi tipo questa:

evento="(condizione)? azione se vera : azione se falsa"

esempio :

Codice:
onclick="(1==1)?alert('vero'):alert('falso')"
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Ti chiedo troppo di farmi un esempio con il mio codice?
Sono una mezza sega con Javascript.

Grazie,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
beh, dovrei prima capire cosa vuoi fare :)

non mi è molto chiaro
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
forse puoi richiamare una funzione che ti fa i controlli

Codice:
onchange='verifica(this.options[select.selectedIndex].value)'


funzione

Codice:
function verifica(select) {
                if(select !=0 && document.getElementById('quantita').options.selectedIndex!=0){
                    calcola(select, document.getElementById('quantita'))
                }
            }

EDIT : Ho scritto senza testare
 
Ultima modifica:

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Grazie.
Sto uscendo per andare al lavoro. Ti faccio sapere più tardi se ha funzionato.
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Purtroppo non ha funzionato. Dunque posto un pò di codice, poichè credo di essermi spiegato male.

HTML:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento senza titolo</title>
<script language="javascript">
function calcola(mod,qt){   
        var prezzi = new Array(
        "120,160,195,260,390",
        "130,180,225,295,450",
        "160,225,290,430,690",
		"0,0,0,380,570");
        
        var m = mod.options[mod.selectedIndex].value;   
        var q = qt.options[qt.selectedIndex].value;   
        
        var p = prezzi[m].split(',');
        var prezzo = p[q];
        
        document.getElementById('prezzo').innerHTML="&euro; " + prezzo + ",00";  
    }
</script>
<script language="javascript">
function set_modello() {
	var select_modello = document.form_acquisto.modello;
	var select_quantita = document.form_acquisto.quantita;	
	var selected_modello = select_modello.options[select_modello.selectedIndex].value;
	select_quantita.options.length=0;
	if (selected_modello == "0") {for(var i=0; i<quantita_senza.length; i++) {select_quantita.options[select_quantita.options.length] = new Option(quantita_senza[i]);}}
    if (selected_modello == "1") {for(var i=0; i<quantita_uno.length; i++) {select_quantita.options[select_quantita.options.length] = new Option(quantita_uno[i]);}}
	if (selected_modello == "2") {for(var i=0; i<quantita_due.length; i++) {select_quantita.options[select_quantita.options.length] = new Option(quantita_due[i]);}}
	if (selected_modello == "3") {for(var i=0; i<quantita_tre.length; i++) {select_quantita.options[select_quantita.options.length] = new Option(quantita_tre[i]);}}
}

var quantita_senza = new Array (
"Quantita",
"100", 
"200", 
"300", 
"500",
"1000" 
);

var quantita_uno = new Array (
"Quantita",
"100", 
"200",
"300",
"500",
"1000" 
);

var quantita_due = new Array (
"Quantita",
"100", 
"200", 
"300", 
"500",
"1000" 
);

var quantita_tre = new Array (
"Quantita",
"500",
"1000" 
);
</script>

<style type="text/css">
<!--
#prezzo {
	width:94px;
	height:20px;
	position:absolute;
	font-size:17px;
	font-weight:bold;
	left: 7px;
	top: 49px;
	text-align:center;
}
-->
</style>
</head>

<body>
<form name="form_acquisto" method="post" action="registrazione.php">
  <select name="modello" id="modello" onchange="if(this.options.selectedIndex!=0 && document.getElementById('quantita').options.selectedIndex!=0){calcola(this, document.getElementById('quantita'))}">
    <option value="seleziona">Modello</option>
    <option value="0">Senza lembi</option>
	<option value="1">1 lembo</option>
	<option value="2">2 lembi inc.</option>
    <option value="3">3 lembi maxi</option>
  </select>
  <select name="quantita" id="quantita" onchange="if(this.options.selectedIndex!=0 && document.getElementById('modello').options.selectedIndex!=0 ){calcola(document.getElementById('modello'), this)}">
    <option value="seleziona">Quantita</option>
  </select>
  <div id="prezzo">€ 0,00</div>
</form>   
</body>

Stando così le cose, se nella select quantita aggiungessi delle option (ad esempio <option value="0">100</option), mi verrebbe calcolato il costo nel DIV prezzo.
Il problema è che le option della select quantita devono uscire dinamicamente, in base al modello scelto. Questo risultato lo ottengo grazie alla funzione set_modello().
Se metto questa funzione nell'onchange della select quantita, togliendo la condizione che sta là, le option si generano dinamicamente.
Il problema è che io ho bisogno che entrambe le cose funzionino contemporaneamente: e il calcolo del prezzo e le option dinamiche.
Quindi ho la necessità di chiamare nell'onchange della select quantita, anche la funzione set_modello, a parte quello che già c'è.
Nonostante sembra che abbia litigato con l'italiano, spero di essermi spiegato e che tu possa darmi una mano.
Tra l'altro, il calcolo del prezzo in automatico, l'ho ottenuto grazie a te, che ieri mi hai suggerito come fare. Dunque lo script dovrebbe esserti familiare :quote:

Saluti,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Secondo me dovresti cercare di fare tutto il lavoro dentro una sola funzione,

ho provato a buttar giu un idea ma mi sono perso svariate volte in un bicchier d'acqua,

vedi se riesci a prendere spunto o a risolvere quello che manca al mio esempio:

HTML:
<head>
    <title>Documento senza titolo</title>
    <script language="javascript">
        
        function calcola(mod,qt){
            
            // recupeo il value delle option selezionate
            var m = mod.options[mod.selectedIndex].value;   
            var q = qt.options[qt.selectedIndex].value; 
            
            // array per le quantita     
            var quantita = new Array(100,200,300,500,1000);
            // array per i prezzi
            var prezzi = new Array(
            "120,160,195,260,390",
            "130,180,225,295,450",
            "160,225,290,430,690",
            "0,0,0,380,570"); 
            
            // se il modello non è impostato azzero il prezzo ed esco
            if(m == 'seleziona') {            
                document.getElementById("prezzo").innerHTML="&euro; 0,00";
                return;
            }
            // recupero i prezzi selezionati
            var p = prezzi[m].split(',');
            // azzero le option            
            qt.options.length = 1;
            // creo le option in base agli elementi degli array       
            for(var i=0; i<p.length; i++) {                              
                // creo la option
                if(p[i] != 0)
                    qt.options[qt.options.length] = new Option(quantita[i],i);        
            }
            // se la quantita non è impostata azzero il prezzo ed esco
            if(q == 'seleziona') {            
                document.getElementById("prezzo").innerHTML="&euro; 0,00";
                return;
            }            
            // recupero il value della option da selezionare            
            var sel = parseInt(q) + 1;
            // reimposto l'option selezionata            
            qt.selectedIndex = sel;            
            // recupero il prezzo
            var prezzo = p[q];
            
            // stampo il prezzo recuperato
            document.getElementById('prezzo').innerHTML="&euro; " + prezzo + ",00";  
        }
    </script>


    <style type="text/css">
        <!--
        #prezzo {
            width:94px;
            height:20px;
            position:absolute;
            font-size:17px;
            font-weight:bold;
            left: 7px;
            top: 49px;
            text-align:center;
        }
        -->
    </style>
</head>

<body>
    <form name="form_acquisto" method="post" action="registrazione.php">
        <select name="modello" id="modello" onchange="calcola(this, document.getElementById('quantita'))">
            <option value="seleziona">Modello</option>
            <option value="0">Senza lembi</option>
            <option value="1">1 lembo</option>
            <option value="2">2 lembi inc.</option>
            <option value="3">3 lembi maxi</option>
        </select>
        <select name="quantita" id="quantita" onchange="calcola(document.getElementById('modello'), this)">
            <option value="seleziona">Quantita</option>
        </select>
        <div id="prezzo">&euro; 0,00</div>
    </form>
</body>
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
E meno male che ti sei perso in un bicchier d'acqua!!! :quote:
A me sembra che funzioni alla grande.
Ci sono solo dei problemini, nel calcolo del prezzo, con l'ultimo modello.
Non appena ho un pò di tempo, provo a sistemare.
Per il momento non mi resta che ringraziarti ancora una volta, poichè tra domenica, ieri ed oggi mi hai tolto più di una castagna dal fuoco.

Saluti,
Marco
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Ciao criric,

solo un'ultima cosa e poi spero di non assillarti più su questo tema.
Ho integrato il tuo script nel mio sito ed ho riscontrato un problema se la scelta effettuata dall'utente ricade sull'ultimo modello; in questo caso infatti, le quantità selezionabili sono solo 500 e 1000 (e così deve essere).
La pagina in cui si effettua la scelta del modello e della quantità è atti.php. Il form in essa contenuto manda a riepilogo.php In questa pagina recupero i dati inseriti dall'utente, tra cui chiaramente anche il modello e la quantità, che mi servono poi per fare una query al db MySQL ed inserire il prodotto nel carrello.
Il problema è che nel carrello non viene inserito nulla.
Allora ho provato a stampare nella pagina riepilogo.php la quantità, che effettivamente rimane vuota.
Questo problema non c'è l'ho con nessuno degli altri modelli (quelli che prevedono tutte le quantità possibili e cioè 100, 200, 300, 500, 1000).
Ho provato allora a mettere mano al Javascript da te creato ed ho visto che se nell'array prezzi, metto tre prezzi iniziali per l'ultimo modello, risolvo il problema del carrello, ma chiaramente nella select della quantità ho 5 option e non 2 come dovrebbe essere.
Credo che facendo una piccola variazione al Javascript si possa risolvere, ma non riesco a capire come.

Saluti,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Si, in effetti era l'ultimo problema su cui mi sono perso,

il problema è nella creazione dei value della select con meno option

che dovrebbe essere
value 0 per i 500
value 1 per i 1000

invece essendo rispettivamente il quarto e il quinto elemento dell'array prendono come value il 4 e il 5

almeno credo sia cosi

ora provo a ridargli un occhiata
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
In realtà dovrebbero prendere 3 e 4.
Non vorrei abusare della tua pazienza, ma spero tu abbia voglia di provare a dargli un'occhiata.
Io per conto mio provo, ma sono una mezza sega in programmazione, come del resto avrai capito.

Saluti,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
una soluzione potrebbe essere quella di disabilitare le opzioni che hanno valore 0
Codice:
// creo le option in base agli elementi degli array       
        for(var i=0; i<p.length; i++) {                              
            // se non ho il prezzo disabilito la option
            if(p[i] == 0 && i != 0)
                qt.options[i].disabled = true;
            // creo la option 
            qt.options[qt.options.length] = new Option(quantita[i],i);                        
        }

ma c'è ancora qualcosa che non mi torna :confused:
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Forse ci siamo:

ti riposto lo script intero

ho aggiunto un elemento fittizio agli array e modificato il ciclo

Codice:
<script type="text/javascript">
        
        function calcola(mod,qt){
            
            // recupeo il value delle option selezionate
            var m = mod.options[mod.selectedIndex].value;   
            var q = qt.options[qt.selectedIndex].value; 
            
            // array per le quantita     
            var quantita = new Array(0,100,200,300,500,1000);
            // array per i prezzi
            var prezzi = new Array(
            "0,120,160,195,260,390",
            "0,130,180,225,295,450",
            "0,160,225,290,430,690",
            "0,0,0,0,380,570"); 
            
            // se il modello non è impostato azzero il prezzo ed esco
            if(m == 'seleziona') {            
                document.getElementById("prezzo").innerHTML="&euro; 0,00";
                return;
            }
        // recupero i prezzi selezionati
        var p = prezzi[m].split(',');
        // azzero le option            
        qt.options.length = 1;
        // creo le option in base agli elementi degli array       
        for(var i=1; i<p.length; i++) {   
            // creo la option 
            qt.options[qt.options.length] = new Option(quantita[i],i);
            // se non ho il prezzo disabilito la option
            if(p[i] == 0) {                
                qt.options[i].disabled = true;
            }
        }
        // se la quantita non è impostata azzero il prezzo ed esco
        if(q == 'seleziona') {            
            document.getElementById("prezzo").innerHTML="&euro; 0,00";
            return;
        }            
        // recupero il value della option da selezionare            
        var sel = parseInt(q);
        // reimposto l'option selezionata            
        qt.selectedIndex = sel;            
        // recupero il prezzo
        var prezzo = p[q];
            
        // stampo il prezzo recuperato
        document.getElementById('prezzo').innerHTML="&euro; " + prezzo + ",00";  
    }
    </script>

Testalo per bene perchè cmq ad un certo punto non ci ho capito più niente e modificavo alla cieca :D
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Domani mattina, appena mi alzo, lo provo e ti faccio sapere.
Grazie tante per l'impegno e la disponibilitá
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno criric,

l'ho provato e mi sono reso conto che le value delle option dell'ultimo modello ancora non prendono i giusti valori.
Il carrello si riempie solo scegliendo 500 come quantità, ma si riempie male (ci va a finire 1000 e relativo prezzo).
Viceversa, rimane vuoto se si sceglie 1000 come quantità.

Saluti,
Marco
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Ok risolto!
Nella pagina riepilogo.php ho effettuato una serie di controlli, partendo dall'1 come value dell'option recuperata

PHP:
$quantita = $_POST['quantita'];
  if ($quantita == 1) {
  $quantita = "100";
  }
  if ($quantita == 2) {
    $quantita = "200";
  }
  if ($quantita == 3) {
    $quantita = "300";
  }
  if ($quantita == 4) {
    $quantita = "500";
  }
  if ($quantita == 5) {
    $quantita = "1000";
  }

Ancora una volta... 1000 grazie. Senza te non ne sarei mai venuto fuori.
Saluti,
Marco
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Puoi usare gli array anche in php :

PHP:
$array_quantita = array(0, 100, 200, 300, 500, 1000);

if (isset($_POST['quantita'])) {
    $quantita = $array_quantita[$_POST['quantita']];
}

Alla fine quello script si è un po incasinato.

Sicuramente tra un paio di mesi quando hai un po piu esperianza riuscirai a scriverlo meglio

:fonzie:
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Mi fa piacere sottolineare come sia la prima volta che trovo una disponibilità tale in un forum.
Generalmente ricevo aiuto, soprattutto in questo forum, ma non così come mi hai dato tu.

Saluti,
Marco
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno criric

mi spiace tornare a seccarti, ma in questi giorni sto testando alcune parti del sito con il mio cliente.
Riguardo il calcolo del prezzo, ci siamo accorti che su IE 7 non funziona alla perfezione.
Se si sceglie l'ultimo modello (3 lembi maxi), le prime 3 quantità (100, 200 e 300) non si disabilitano come invece succede su tutti gli altri browser; quindi si possono ad esempio scegliere 100 pezzi del modello 3 lembi maxi ed il prezzo viene calcolato a 0.

Puoi aiutrami per favore?

Grazie,
Marco
 
Discussioni simili
Autore Titolo Forum Risposte Data
M [PHP] Errore nell' assegnazione della variabile $this->id su una funzione PHP 1
R Variabile non risconosciuta dentro una funzione PHP 1
F Funzione Glob - ricerca file contenente una parola PHP 1
Domenico_Falco1 Associare una stessa funzione get a due eventi a.click con classi differenti Ajax 6
maxnegri [PHP]Funzione di calcolo prezzo di una camera in un range di date PHP 62
L [PHP] problema count messo in una funzione. PHP 1
R [Javascript] Rendere una funzione sempre visibile Javascript 2
C Creazione di una funzione per il filtraggio dei campi di un db Presentati al Forum 0
C richiamare una funzione in un altro script php PHP 1
P [Javascript] Inserire una nuova condizione in una funzione Javascript 3
C [Javascript] Chiamata di una funzione da *.js esterno Javascript 1
J [Javascript] una funzione ricorsiva che non capisco come lavori Javascript 6
G [Javascript] nome da dare ad una funzione Javascript 1
ken_korn [Javascript] Portare variabile in una funzione esterna al suo scope Javascript 2
P [Javascript] eseguire una funzione dopo un'altra Javascript 0
borgo italia una funzione per verificare l'invio di files Snippet PHP 0
A utilizzare array di una funzione in un'altra jQuery 1
S PHP: inviare via email contenuto di una funzione PHP 4
A Chiamare una specifica funzione in una pagina php PHP 1
gandalf1959 richiamare una funzione da un'altra funzione PHP 1
gandalf1959 richiamare una funzione: funziona solo la seconda volta... PHP 7
F Aggiornare marker su mappa google con una funzione ajax richiamata al cambio di una select Ajax 2
A chiamata di una funzione esterna rispetto al file js chiamante jQuery 3
D PHP:funzione che opera una query su argomento PHP 8
JackIlPazzo Chiamare una funzione specifica di php da una richiesta ajax? PHP 2
Monital Invio email con dati di una funzione JS PHP 1
gandalf1959 Chiedere conferma all'utente prima di eseguire una funzione PHP 5
M Far partire una funzione/codice php con javascript Javascript 1
U Far partire una funzione JavaScript premendo bottone in html Javascript 13
M Passare una funzione a una proprietà di oggetto Javascript 2
G Funzione che resta in ascolto per una chiamata esterna Javascript 1
F Dubbio su una funzione personalizzata PHP 3
B Funzione per ottenere una determinata stringa PHP 4
L assegnare funzione solo ad una pagina PHP 1
D Scaricare database MYSql con una funzione MySQL 0
M Lanciare una funzione asp.net con javascript. E' possibile? ASP.NET 0
ivarello Togliere una Funzione jQuery 4
F Trasporto variabile da una funzione all'altra Javascript 3
D Stampare variabile da una funzione PHP 1
L problema nella implementare una funzione con ritorno PHP 2
F Problema tabs al richiamo di una funzione jQuery 1
P Passare un valore, o arriare una funzione da pagina2.php in pagina1.php Javascript 2
S Riportare risultato di una funzione nello script. PHP 2
B AIUTO: come passare una variabile php ad una funzione javascript Javascript 2
E ordinamento array multidimensionale per un valore ottenuto tramite una funzione PHP 1
I Spostare codice js inline in una funzione js con l'aiuto del dom Javascript 1
S [jQuery] far ripetere una funzione jQuery 2
M Verifica se una Funzione appartiene ad una Classe PHP 9
M Estrapolare stringhe da una funzione PHP 7
C Aumentare le dimensioni di una textarea in funzione delle righe presenti. Javascript 13

Discussioni simili