2013-08-14 9 views
10

Próbuję wywołać funkcję o nazwie .onchange wybranego, ale nic się nie dzieje. Gdy funkcja jest opisana po atrybucie, działa.jquery: Wywołanie funkcji według nazwy przy wybranej zmianie

to nie działa

HTML:

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

Scenariusz:

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

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

to działa

HTML:

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

SCENARIUSZ:

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

EDIT:

Ok, dla wszystkich tych, którzy powiedzieli mi to funkcję na tym samym skrypcie. Nie jest to możliwe, ponieważ funkcja testMessage() znajduje się w zewnętrznym skrypcie .js zawartym w kodzie HTML <head>.

+2

Co mówi konsola? Coś jak "testMessage nie jest zdefiniowane"? – tymeJV

+0

Powinieneś naprawdę zrobić wiązanie zdarzeń w dokumencie. Funkcja już działa –

+0

Działa dobrze dla mnie: http://jsfiddle.net/FMynS/ –

Odpowiedz

19

To dlatego opiekun testMessage nie jest określona podczas wiązania go w razie zmian.

powinien działać, jeśli to było w tym samym kontekście skryptu jak poniżej,

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

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

Kod wewnątrz <script></script> są wykonywane jedna po drugiej postępująca od góry i testMessage funkcji nie istnieje wewnątrz pierwszej <script></script>.

Masz kilka opcji tutaj

  1. Umieścić go wewnątrz anonimowej funkcji, która pozwoli skrypt rozwiązać funkcję testMessage później.[Zgodnie z sugestią w Optimus Prime odpowiedzi]

    <script type="text/javascript"> 
        $('#numb').change(function() { 
        testMessage 
        }); 
    </script> 
    <script type="text/javascript"> 
        function testMessage(){ 
         alert('Hello'); 
        } 
    </script> 
    
  2. Dołącz skrypt, który ma testMessage funkcję powyżej script który wiąże testMessage jak poniżej,

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

Zobacz edytuj na moje pytanie – Perocat

+1

@Perocat Zawiń to wewnątrz anonimowej funkcji. Funkcja handler "testMessage" jest wymagana do rozstrzygnięcia podczas wiązania do zdarzenia onchange, ale nie do zawartości funkcji obsługi. –

0

Musisz zdefiniować wywołanie zwrotne w funkcji zmiany.

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

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

To powinno naprawić twój problem.

4

Zamiast próbować,

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

To działa! czemu? – Perocat

+1

@Perocat Funkcja handler jest wymagana do rozstrzygnięcia podczas wiązania, ale nie do zawartości funkcji obsługi. –

+1

@Perocat Funkcja anonimowa opóźnia dereferencję 'testMessage'. Do tego czasu zostanie on zdefiniowany. –

1

Spróbuj i miejsce w tym samym skrypcie tag:

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

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

Zobacz edytuj na moje pytanie – Perocat

2

Working Jsfiddle spróbuj tego:

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

Zobacz edytuj na moje pytanie – Perocat

+0

zaktualizowany kod ..... sprawdź teraz :) –

+0

Już wypróbowany, nie działa – Perocat

0

nie sądzę istnieje jeszcze swoją odniesienie do funkcji jest tu dwa sposoby można to zrobić. Umieszczam wersję z podpowiedziami jako sugestię, ponieważ może to pomóc w ogólnym oczyszczeniu kodu.

HTML:

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

SCENARIUSZ:

// przestrzeni nazw i używając Proxy

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

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

// Właśnie ogłoszony

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

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

Jeśli metoda jest w innym pliku upewnij się, że y umieść ten plik przed jednym z powiązaniem zdarzenia. Czy otrzymujesz jakiekolwiek błędy konsoli?

Powiązane problemy