2013-08-14 15 views
10

Sto provando a chiamare una funzione con il nome .onchange di una selezione ma non succede nulla. Quando la funzione viene decrittata dopo l'attributo, funziona.jquery: chiama la funzione per nome alla modifica selezionata

QUESTO NON FUNZIONA

HTML:

<select id="numb"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
</select> 

SCRIPT:

<script type="text/javascript"> 
    $('#numb').change(testMessage); 
</script> 

<script type="text/javascript"> 
    function testMessage(){ 
     alert('Hello'); 
    } 
</script> 

QUESTO FUNZIONA

HTML:

012.
<select id="numb"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
</select> 

SCRIPT:

<script type="text/javascript"> 
    $('#numb').change(function(){ 
     alert('Hello') 
    }); 
</script> 

EDIT:

Ok, per tutti quelli che mi ha detto di includere la funzione sullo stesso copione. Questo non è possibile perché la funzione testMessage() si trova in uno script esterno .js incluso nello <head> dell'HTML.

+2

Cosa dice la tua console? Qualcosa come "testMessage non è definito"? – tymeJV

+0

si dovrebbe davvero fare il binding di evento all'interno di una funzione document.ready –

+0

Funziona bene per me: http://jsfiddle.net/FMynS/ –

risposta

19

Si perché il gestore testMessage non è definito quando legandolo alla manifestazione cambiamento.

Dovrebbe funzionare se era nello stesso contesto script come sotto,

<script type="text/javascript"> 
    $('#numb').change(testMessage); 

    function testMessage(){ 
     alert('Hello'); 
    } 
</script> 

codice all'interno <script></script> vengono eseguite una per una progressiva dall'alto e testMessage funzione non esiste all'interno del primo <script></script>.

Hai due opzioni qui,

  1. metterlo dentro una funzione anonima che permetterà lo script per risolvere la funzione testMessage tardi.[Come suggerito in Optimus Prime risposta]

    <script type="text/javascript"> 
        $('#numb').change(function() { 
        testMessage 
        }); 
    </script> 
    <script type="text/javascript"> 
        function testMessage(){ 
         alert('Hello'); 
        } 
    </script> 
    
  2. includere lo script che ha testMessage funzione al di sopra del script che lega il testMessage come qui di seguito,

    <script type="text/javascript"> 
    function testMessage(){ 
        alert('Hello'); 
    } 
    </script> 
    <script type="text/javascript"> 
        $('#numb').change(testMessage); 
    </script> 
    
+0

Vedere modifica sulla mia domanda – Perocat

+1

@Perocat Avvolgere nella funzione anonima. La funzione di gestione 'testMessage' deve essere risolta quando si esegue il binding all'evento onchange, ma non il contenuto della funzione del gestore. –

0

È necessario definire un callback sulla funzione di modifica.

<script type="text/javascript"> 
    $('#numb').change(function(){ 
     testMessage(); 
    ); 

    function testMessage(){ 
     alert('Hello'); 
    } 
</script> 

Questo dovrebbe risolvere il problema.

4

Invece di cercare,

<script type="text/javascript"> 
    $('#numb').change(function(){ 
     testMessage(); 
    }); 
</script> 
+0

Questo funziona! perché? – Perocat

+1

@Perocat La funzione di gestione deve essere risolta durante l'associazione, ma non il contenuto della funzione di gestione. –

+1

@Perocat La funzione anonima ritarda il dereferenziamento di 'testMessage'. A quel punto, sarà stato definito. –

1

Prova questa e il luogo nello stesso script tag:

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $('#numb').change(testMessage); 

     function testMessage(){ 
      alert('Hello'); 
     } 
    }); 
</script> 
+0

Vedere modifica sulla mia domanda – Perocat

2

Working Jsfiddle provare questo:

<script type="text/javascript"> 
    $('#numb').on('change',testMessage); 
</script> 
+0

Vedere modifica sulla mia domanda – Perocat

+0

codice aggiornato ..... controllare ora :) –

+0

Già provato, non funziona – Perocat

0

Non credo che il vostro riferimento esiste ancora la funzione qui è due modi si potrebbe farlo. Ho inserito la versione dei nomi come suggerimento perché potrebbe aiutare a ripulire il codice in generale.

HTML:

<select id="numb"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
</select> 

SCRIPT:

// namespace e l'utilizzo di proxy

<script type="text/javascript"> 
    var project = project || {}; 
    project = { 
     testMessage: function (event) { 
      alert('Hello'); 
     } 
    }; 

    $('#numb').change($.proxy(project.testMessage, project)); 
</script> 

// appena dichiarato

<script type="text/javascript"> 
    function testMessage(){ 
     alert('Hello'); 
    } 

    $('#numb').change(function(event) { 
     testMessage(); 
    }); 
</script> 

Se il metodo è in un altro file assicurati di ou includere quel file prima di quello con l'associazione degli eventi. Stai riscontrando errori nella console?

Problemi correlati