2009-11-15 4 views
0

У меня есть функция в Javascript, которая отлично работает с использованием прототипа. Функция используется для динамического изменения поля выбора на основе выбора другого поля.ошибка при запуске прототипа и jQuery

var sizes_286 = new Array(); 
     sizes_286.push(new Array(536, 'Pequeno', 1661)); 
     sizes_286.push(new Array(536, 'Médio', 1662)); 
     sizes_286.push(new Array(536, 'Grande', 1663)); 
     sizes_286.push(new Array(536, 'ExtGrande', 1664)); 

    function varianteSelected_286(){ 
     var_id = $('variante_286').getValue(); 
     options = $('tamanho_286').options; 
     options.length = 1; 
     sizes_286.each(function(size){ 
     if (size[0] == var_id){ 
      options[options.length] = new Option(size[1], size[2]); 
     } 
    }); 
} 


document.observe('dom:loaded', function(){ 
    $('variante_286').observe('change', varianteSelected_286); 
}); 

Проблема в том, что я начал использовать jQuery в своем проекте, и с тех пор эта функция перестала работать. Я использую jQuery (1.3.2) и прототип (1.6.1).

  • Как создать jQuery-версию моей старой функции? или
  • Как я могу заставить его работать после загрузки jquery?
  • Есть ли короткая и элегантная версия этой же функции?

ответ

4

Если бы я был ты, я бы попытаться избежать использования обоих механизмов. Просто сделайте это в JQuery, как это:

<script type="text/javascript"> 
    var sizes_286 = [ 
     {id: 536, name: 'Pequeno', size: 1661}, 
     {id: 536, name: 'Médio', size: 1662}, 
     {id: 536, name: 'Grande', size: 1663}, 
     {id: 536, name: 'ExtGrande', size: 1664} 
    ]; 

    $(document).ready(function(){ 
     $('#variante_286').change(function(){ 
      var var_id = $(this).val(); 
      var select = $('#tamanho_286'); 

      var options = ''; 
      $.each(sizes_286, function(i, n){ 
       if (n.id == var_id) { 
        options += '<option value="' + n.size + '">' + n.name + '</option>'; 
       } 
      }); 

      select.html(options); 
     }); 
    }); 
</script> 
+0

ваша реализация работала хорошо для меня, и теперь я отключил прототип. Thaks! –

+0

Не беспокойтесь, но на самом деле я пропустил двойные скобки в своем коде, должен быть «

+0

Я протестировал этот код в IE8, и он не работает! Любое предложение? –

5

Иногда возникает проблема с функцией $ JQuery с тем же самым из protoype, и в таких случаях мы вызываем функцию, чтобы функция Jquery $ не сталкивалась с функцией Prototype.

Функция jQuery.noConflict()

Пожалуйста, обратитесь к ссылке: http://docs.jquery.com/Core/jQuery.noConflict

http://docs.jquery.com/Using_jQuery_with_Other_Libraries

2

новичка прямо о том, как получить JQuery и прототип бежать вместе, но если это все, в чем вы нуждаетесь, я думаю, вам лучше переписать свою функцию в jquery и избавиться от необходимости запускать оба фреймворка параллельно. Следующие должны работать (оставить объявление массива, как это):

function varianteSelected_286() { 
    var_id = $(this).val(); 
    options = $('#tamanho_286')[0].options; 
    options.length = 1; 
    for(var i = 0; i < sizes_286.length; i++) { 
    var size = sizes_286[i]; 
    if (size[0] == var_id) { 
     options[options.length] = new Option(size[1], size[2]); 
    } 
    } 

$(document).ready(function() { 
    $('#variante_286').change(varianteSelected_286); 
}); 
0

Вам нужно создать функцию область для использования JQuery, как $ и вы, вероятно, можете оставить прототип по умолчанию $.

JQuery код:

(function($) { 
    $('body').hide() 
})(jQuery.noConflict()); 
Смежные вопросы