2016-05-01 15 views
1

Ich erstellte "omarkasec" als eine Funktion und ich bekomme Automarken aus der Datenbank über Ajax und ich fügte am ausgewählten Element diese Automarken als Optionen über Ajax - -> Erfolg. Aber ich kann keinen Wert dieses Auswahlelement festlegen.Ich kann keinen Wert einstellen oder Wert von ausgewählten Elementen über Ajax

habe ich versucht, diese Codes für Sollwert.

  1. $ ('[name = marka] wählen') val ('Lada');
  2. $ ('select [name = marka] option [wert = Lada]'). Prop ('ausgewählt', true);
  3. $ ('select [name = marka] option [wert = Lada]'). Attr ('ausgewählt', 'ausgewählt');

Diese Codes funktionieren nicht. Aber wenn ich Alarm hinzufüge (""); in der "omarkasec" -Funktion funktionieren die Codes und wenn ich den Alarm entferne (""); Die Codes funktionieren nicht.

<div id="marka" class="gizle" > 
    Marka: <br> 
    <select name="marka" onchange="omodelsec()" size="10" ></select> 
</div> 

<script language='javascript' type='text/javascript'> 
    function omarkasec() { 
     $.ajax({ 
      type: "POST", 
      url: "aracsor.php", 
      dataType: "json", 
      data: { 
       otomobilmodelyili : $("select[name=modelyili]").val(), //This work, because i created php. 
      }, 
      success: function(donen){ 
       $("#marka").removeClass("gizle"); 
       $("#model").addClass("gizle"); 
       $("#yakit").addClass("gizle"); 
       $("#sanziman").addClass("gizle"); 
       $("#cekis").addClass("gizle"); 
       $("#kasatipi").addClass("gizle"); 
       $("select[name=marka]").empty(); 
       $.each(donen, function (index, otomarka) { 
        $("select[name=marka]").append($("<option>", { 
         text : otomarka, 
         value : otomarka, 
        })); 
       }); 
      }, 
     }); 
    //if I add here alert(""); The following code works. 
    } 
    </script> 

<script language='javascript' type='text/javascript'> 
    omarkasec(); 
    $('select[name=marka]').val('Lada'); 
    alert($('select[name=marka]').val()); //if I add alert(""); this code work but if I remove alert(""); this code get null value. 
</script> 
+0

Versuchen Sie den Code in zwischen '$ setzen (document) .ready (function() { // Code hier eingeben }); 'Sie müssen warten, bis doucment geladen wird, bevor Elemente und Einstellwerte gefunden werden. – TheUknown

Antwort

1

Ajax-Aufrufe sind asynchron. Ihr Code führt den $.ajax() Aufruf aus, der eine Rückruffunktion übergibt, aber diese Rückruffunktion wird in diesem Moment nicht ausgeführt.

Die Ausführung führt sofort die Anweisung nach $.ajax(), aber in diesem Moment wurde der Inhalt nicht geladen.

Wenn Sie jedoch eine alert() ausführen, kann der Rückruf möglicherweise ausgelöst werden, während das Warndialogfeld geöffnet ist und somit der Inhalt von Ihrer Rückruffunktion geladen wird. Wenn Sie das Popup dann schließen, wird der darauf folgende Code den Inhalt finden.

Eine Möglichkeit, dies zu lösen, ist der Rückgabewert des $.ajax Aufruf zu verwenden, die ein Versprechen ist, und die Kette ein then Aufruf es:

function omarkasec(oncomplete) { 
    return $.ajax({ 
// ^^^^^^ 
     type: "POST", 
     url: "aracsor.php", 
     dataType: "json", 
     data: { 
      otomobilmodelyili : $("select[name=modelyili]").val(), 
     }, 
     success: function(donen){ 
      $("#marka").removeClass("gizle"); 
      $("#model").addClass("gizle"); 
      $("#yakit").addClass("gizle"); 
      $("#sanziman").addClass("gizle"); 
      $("#cekis").addClass("gizle"); 
      $("#kasatipi").addClass("gizle"); 
      $("select[name=marka]").empty(); 
      $.each(donen, function (index, otomarka) { 
       $("select[name=marka]").append($("<option>", { 
        text : otomarka, 
        value : otomarka, 
       })); 
      }); 
     }, 
    }); 
} 

// provide (anonymous) callback function to the `then` method: 
omarkasec.then(function() { 
    // this code will only be executed when content is loaded: 
    $('select[name=marka]').val('Lada'); 
    alert($('select[name=marka]').val()); 
}); 
+0

Dank Noderman und Trincot. Die folgenden Codes haben mein Problem gelöst. 'omarkasec (function() { // Dieser Code wird nur ausgeführt, wenn der Inhalt geladen wird: $ ('select [name = marka]'). Val ('Lada'); alert ($ ('select [name = marka] '). val()); }); ' –

+0

Gern geschehen! – trincot

1

Sie haben eine Wettlaufsituation. Sie rufen omarkasec() auf und warten nicht darauf, dass die Ausführung der Aktion select.val() beendet wird. Wenn Sie die Warnung hinzufügen, "funktioniert" sie, weil sie dem Code etwas Zeit gibt, um den Ajax-Aufruf zu vervollständigen und die Werte zu füllen. Wenn Sie darauf aufmerksam machen, sind die Werte bereits gefüllt.

Der gesamte Code, der vom Ergebnis des Ajax-Aufrufs abhängt, muss im Erfolgsrückruf enthalten sein.

+0

Ja, eine Race-Bedingung - Ich habe kürzlich ein ähnliches Problem gemeldet. Vielleicht wird das vereinfachte Beispiel hier den Rennzustand deutlich veranschaulichen? http://stackoverflow.com/questions/36949904/reference-errors-thrown-in-included-file-unless-calling-file-includes-slow-co –