ошибка при загрузке как прототипа, так и jQuery - PullRequest
0 голосов
/ 15 ноября 2009

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

   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 ]

5 голосов
/ 15 ноября 2009

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

Функция является jquery.noConflict ()

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

http://docs.jquery.com/Using_jQuery_with_Other_Libraries

4 голосов
/ 15 ноября 2009

На вашем месте я бы старался избегать использования обеих платформ. Просто сделайте это в 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>
2 голосов
/ 15 ноября 2009

Новичок прав в том, как заставить 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 голосов
/ 15 ноября 2009

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

JQuery код:

(function($) {
    $('body').hide()
})(jQuery.noConflict());
...