2016-05-01 1 views
1

Я создал функцию «omarkasec» как функцию, и я получаю марки автомобилей из базы данных через ajax, и я добавил в элементе выбора эти бренды автомобилей в качестве опций через ajax - -> успех. Но я не могу установить значение этого элемента select.Я не могу установить значение или получить значение из элементов выбора, созданных с помощью Ajax

Я попытался это коды для заданного значения:.

  1. $ ('выберите [имя = Marka]') VAL ('Лада');
  2. $ ('select [name = marka] опция [значение = Lada]'). Prop ('selected', true);
  3. $ ('select [name = marka] option [значение = Lada]'). Attr ('selected', 'selected');

эти коды не работают. Но если я добавлю предупреждение (""); в функции «omarkasec» коды работают, и если я удалю предупреждение («»); коды не работают.

<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

Попробуйте поместить свой код между '$ (документ) .ready (function() { // введите код здесь }); 'Вам нужно дождаться загрузки до начала поиска элементов и значений уставок. – TheUknown

ответ

1

Ajax-вызовы асинхронны. Ваш код выполняет вызов $.ajax(), передавая ему функцию обратного вызова, но эта функция обратного вызова не выполняется в этот самый момент.

Выполнение немедленно начинается с заявления после $.ajax(), но в этот момент контент не был загружен.

Однако, если вы выполните alert(), вызов может быть вызван, когда диалог предупреждения открыт, и, таким образом, контент загружается функцией обратного вызова. Если вы затем закроете всплывающее окно, любой код, следующий за ним, найдет контент.

Один из способов решить эту проблему, чтобы использовать возвращаемое значение $.ajax вызова, который является обещание и ЦЕПЬ then вызова к нему:

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

Спасибо noderman и trincot. Следующие коды решили мою проблему. 'omarkasec (function() { // этот код будет выполнен только при загрузке содержимого: $ ('select [name = marka]'). Val ('Lada'); alert ($ ('select [name = marka] '). val()); }); ' –

+0

Добро пожаловать! – trincot

1

У вас есть состояние гонки. Вы вызываете omarkasec() и не дожидаетесь его завершения, чтобы выполнить действие select.val(). Когда вы добавляете предупреждение, он «работает», потому что он дает коду дополнительное время для завершения вызова ajax, заполняя значения. Когда вы его предупреждаете, значения уже заполнены.

Весь ваш код, зависящий от результата вызова ajax, должен быть внутри обратного вызова успеха.

+0

Да условие гонки. Недавно я опубликовал аналогичную проблему. Может быть, упрощенный пример здесь ясно иллюстрирует состояние гонки? http://stackoverflow.com/questions/36949904/reference-errors-thrown-in-included-file-unless-calling-file-includes-slow-co –

Смежные вопросы