2012-01-12 6 views
0

Это следующий фрагмент кода работает отлично, используя jQuery1.2.3, но он не работает с последней версией JQuery:getJSON не работает с последней версией JQuery

$.getJSON(url,{str: $$.val() }, function(j){ 
    if (j.length > 0) { 
     var options = '<option value="">' +params.firstOption+ '</option>'; 
     for (var i = 0; i < j.length; i++) { 
     options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>'; 
     } 
    } 
    $dest.removeAttr('disabled') 
     .html(options) 
     .find('option:first') 
     .attr('selected', 'selected'); 
}); 

Пожалуйста, обратите внимание, что это выше код фактически часть плагина jQuery для каскадного выпадающего списка. Он дает желаемый результат, если я использую jQuery1.2.3. Полный код плагина выглядит следующим образом:

(function($){ 

    $.fn.linkedSelect = function(url,destination,params) { 


     var params = $.extend({ 

     firstOption : 'Please Select', 

     loadingText : 'Loading...' 

     },params); 

     var $dest = $(destination); 

     return this.each(function(){ 

     $(this).bind('change', function() { 

      var $$ = $(this); 

      $dest.attr('disabled','false') 
       .append('<option value="">' +params.loadingText+ '</option>') 
       .ajaxStart(function(){ 

        $$.show(); 

      }); 

      $.getJSON(url,{str: $$.val() }, function(j){ 
       alert('User clicked on this.'); 
       if (j.length > 0) { 

        var options = '<option value="">' +params.firstOption+ '</option>'; 

        for (var i = 0; i < j.length; i++) { 

        options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>'; 

        } 

       } 

       $dest.removeAttr('disabled') 
        .html(options) 
        .find('option:first') 
        .attr('selected', 'selected'); 

      }); // end getJSON 

     }); // end change 

     }); // end return each 

    }; // end function 

})(jQuery); 

Пожалуйста, обратите внимание, что он не может генерировать следующее предупреждающее сообщение

alert('User clicked on this.'); 

, что написано внутри функции getJSON для отладки цели, если я использую последнюю версию JQuery. И я также отслеживал использование JS-отладчика, он не может войти в функцию getJSON, если я использую последнюю версию jQuery. Но он показывает это предупреждающее сообщение, если я использую jQuery1.2.3.

В консоли ошибок, предупреждающие сообщения являются:

Warning: reference to undefined property b.p.height 
Source File: http://localhost//js/jquery.jqGrid.min.js Line: 99 
Warning: reference to undefined property b.p.serializeGridData 
Source File: http://localhost/js/jquery.jqGrid.min.js Line: 62 
Warning: reference to undefined property jQuery.event.triggered 
Source File: http://localhost/js/jquery1.7.js Line: 2924 
Warning: reference to undefined property elem[jQuery.expando] 
Source File: http://localhost/js/jquery1.7.js Line: 1719 

Что я должен изменить, чтобы адаптироваться с последней версией JQuery. Спасибо.

+5

Добро пожаловать в переполнение стека! «Это не работает» - это * никогда * хорошее описание ошибки. Пожалуйста, опишите, что пошло не так, какие сообщения об ошибках вы получите и т. Д. –

+1

так где же именно сбой? вы можете добавить некоторый файл console.log в код, чтобы узнать, и какая последняя версия jquery, которую вы пытаетесь использовать, и как вы ее загрузили? – alonisser

+0

Не могли бы вы более подробно рассказать, как он не работает и что такое ваш тестовый пример? Вы тестируете одни и те же данные на одном и том же коде, и единственная разница - это версия jQuery, правильно? –

ответ

0

Скорее всего, ваш сервер производит недействительный JSON.

+0

Спасибо всем за быстрый ответ. @blockhead, я тестировал. Он производит действительный JSON. – Agilox

+0

Да, вы правы. На самом деле, jQuery 1.3 и ранее использовали JavaScript для оценки входящего JSON. jQuery 1.4 использует собственный анализатор JSON, если он доступен. Он также проверяет достоверность входящего JSON, поэтому искаженный JSON (например, {foo: "bar"}) будет отклонен jQuery в jQuery.getJSON и при указании «json» как dataType запроса Ajax. – Agilox

+1

Сценарий на стороне сервера создавал бы JSON, например {Value: 28.000, Display: "28.000"} и отлично работал бы с jQuery1.3 +. Для последнего jQuery я должен изменить его как {«Значение»: «28.000», «Показать»: «28.000»} – Agilox

2

Основываясь на ошибках в консоли, похоже, что версия jqGrid, которую вы используете, несовместима с jQuery 1.7.

Если это та же самая версия jqGrid, которую вы использовали с jQuery 1.2.3, это не удивительно. jQuery 1.2.3 - это древняя история, выпущенная почти четыре года назад.

+0

Я обновил jqGrid и его версию jQuery точно в соответствии с документацией. Обратите внимание, что в функциях jqGrid нет проблем, но проблема в плагине Cascading (Linkedselect). Спасибо. – Agilox

+0

О, тогда вполне возможно, что это другой плагин. Чтобы начать, вы должны использовать ['.prop()'] (http://api.jquery.com/prop) вместо '.attr()' для отключения '$ dest'. –

+0

Я проверил каскадный плагин без плагина jqGrid в отдельном файле. Он создает ту же проблему с jQuery1.5.2 в каскадной функциональности, но без проблем с jQuery1.2.3. Таким образом, проблема заключается только в плагине Cascading. Какой лучший каскадный плагин вы посоветуете использовать вместо этого? Я также использовал .prop() вместо .attr() для отключения $ dest для целей тестирования. – Agilox

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