2010-01-09 6 views
25

Ich habe ein Auswahlfeld, das dynamisch mit einem Ajax-Aufruf ausgefüllt wird, der einfach alle HTML-Auswahloptionen zurückgibt. Hier ist der Teil von PHP, der nur die Select-Tags zurückgibt und jede Option/jeden Wert dynamisch ausfüllt.Jquery .change() -Funktion funktioniert nicht mit dynamisch bevölkert SELECT-Liste

echo "<select name='player1' class='affector'>"; 
echo "<option value='' selected>--".sizeof($start)." PLAYERS LOADED--</option>"; 

foreach ($start as $value) { 
    echo "<option value='".$value."'>".$value."</option>"; 
} 
    echo "</select>"; 
} 

Nach dieser Liste aufgefüllt wird, ich versuche ein Änderungsereignis zu nennen, so dass, wenn die Standardoption in der SELECT-Liste oder in einem Textfeld mit der gleichen Klasse geändert wird, es eine Schaltfläche Radio deaktiviert in einem anderen Teil des Formulars festgelegt. (Sie können die anfängliche Frage sehe ich gebeten, diesen Teil der Funktionalität zum Laufen zu bringen here)

$('.affector').change(function(){ 
     $(this).parents('tr').find('input:radio').attr('disabled', false); 
}); 

Aus irgendeinem Grund, obwohl ich das Auswahlfeld den richtigen Klassennamen (Affektor) geben, wenn ich verschiedene Optionen auswählen Im Feld werden die anderen Teile des Formulars nicht deaktiviert. Das statische Textfeld mit der gleichen Klasse funktioniert einwandfrei. Ich bin ratlos.

Irgendwelche Ideen?

+3

Quick-Tipp, statt' echo ', versuchen:' echo "< Optionswert = '$ Wert'> "'. Wenn Sie auf ein Array zugreifen, können Sie 'echo' tun.

Antwort

20

einfach auf Ihre letzte Frage kommentiert ... Hier ist, was ich sagte:

Verwendung jQuery

binden Funktion
function addSelectChange() { 
    $('select').bind('change', function() { 
     // yada yada 
    }); 
} 

Anruf addSelectChange in Ihren Ajax-Erfolg. Es sollte den Trick machen. Sehen Sie sich auch das jQuery-Live-Ereignis an (wenn Sie Ereignisse für alle aktuellen und zukünftigen DOM-Elemente in einem späteren Projekt oder etwas festlegen möchten). Leider werden das Change Event und einige andere noch nicht live unterstützt. Bind ist die nächste beste Sache

+0

tolle Antwort !!! sofort geholfen! –

3

Für Elemente, die in das DOM dynamisch eingefügt werden, müssen ihre Veranstaltungen mit

$('.selector').bind('change',function() { doWork() }); 

weil Dies ist gebunden, wenn Sie $(function(){}); laufen und binden Ereignisse $.click oder $.change verwenden, etc. Sie Ereignisse Bindung an Elemente bereits im DOM vorhanden. Jede Manipulation, die Sie danach machen, wird nicht von dem beeinflusst, was im $(function(){}); Anruf passiert. $.bind weist Ihre Seite an, nach zukünftigen Elementen in Ihrem Selektor sowie nach aktuellen Elementen zu suchen.

+0

Sowohl .change als auch .bind funktionieren auf die gleiche Weise. Sie binden nur an Elemente, die sich derzeit im DOM befinden. – Anurag

+0

@anurag - falsch. Wenn beide Elemente bereits im DOM sind, funktionieren sie auf die gleiche Weise. aber .change bindet keine neuen Elemente im DOM (was der Grund ist, warum das OP die Frage stellt ...), .bind bindet aktuelle UND zukünftige Ereignisse an Elemente. – Jason

+0

@Jason: Es ist nicht so schwer zu testen .. sieh dir dieses kleine HTML-Snippet an (http://slexy.org/raw/s2XA8QihVm) Ich schrieb, um zu testen, ob 'bind' für zukünftige dom-Elemente funktioniert und es nicht tut . Auch dies stammt aus jQuerys Quelle, es leitet im Grunde die Funktionsaufrufe für 'change()', 'mouseover()', 'blur()' usw. zu 'bind()' weiter. Hier ist ein kleiner Ausschnitt aus der jQuery-Quelle, der zeigt: http://slexy.org/view/s206rDeFeO oder Sie können die gesamte Quelle auf code.jQuery.com selbst sehen - http://code.jquery.com/jquery-latest. js. Und 'live()' ist die Funktion, die sowohl an aktuelle als auch an zukünftige Ereignisse bindet. – Anurag

1

versuchen .live: http://docs.jquery.com/Events/live

Von docs: Wird ein Handler auf ein Ereignis (wie Klick) für alle aktuellen - und zukünftigen - verglichene Element. Kann auch benutzerdefinierte Ereignisse binden.

+0

** "Derzeit nicht unterstützt: ... ändern ..." ** – Sampson

+0

Stapelüberlauf FEHLER! –

5

ein Beispiel unter Verwendung .live()

$('#my_form_id select[name^="my_select_name"]').live('change', (function() { 
    console.log($("option:selected", this).val()); 
    }) 
); 
+1

Diese .live() funktioniert immer für mich, bei dynamisch besetzten Auswahlfeld. –

+3

.live() ist jetzt veraltet. Verwenden Sie etwas wie '$ (Dokument) .on (" ändern "," # my_form_id wählen [Name^= "my_select_name"] ', Funktion() {...}) ' – Seybsen

1

ich als Lösung gefunden nur

<select id="myselect"></select> 

in PHP/HTML-Datei zu machen und dann Optionen generieren für sie durch ajax:

$.post("options_generator.php", function (data) { $("#myselect").append(data); }); 

In options_generator.php Echo Optionen nur:

echo "<option value='1'>1</option>"; 
echo "<option value='2'>2</option>"; 
6

A mehr up to date Antwort ..

Da die Elemente dynamisch bestückt sind, suchen Sie event delegation.

Verwenden Sie nicht .live()/.bind()/.delegate(), obwohl. Sie sollten .on() verwenden.

Nach den jQuery API docs:

Ab jQuery 1,7, die .on() Methode ist die bevorzugte Methode für die zu einem Dokument, Event-Handler zu befestigen. Für frühere Versionen wird die Methode verwendet, um einen Event-Handler direkt an Elemente anzuhängen. Die Handler werden an die aktuell ausgewählten Elemente im jQuery-Objekt angehängt. Diese Elemente müssen also an dem Punkt vorhanden sein, an dem der Aufruf an erfolgt. Informationen zur flexibleren Ereignisbindung finden Sie in der Beschreibung der Ereignisdelegierung in .on().

Daher würden Sie etwas wie folgt verwenden: "<".. $ Value option value =" ">"

$(document).on('change', 'select', function (e) { 
    /* ... */ 
}); 
+1

ja das ist für alle Szenarien, statische oder dynamischer Inhalt :) – user889030