Ошибка Knockout 2.2.0 в jQuery 1.9
Я скопировал один из примеров knockoutjs:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/2.2.0/knockout-min.js"></script>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
<h2>Participants</h2>
Here are the participants:
<div data-bind="template: { name: 'person-template', data: buyer }"></div>
<div data-bind="template: { name: 'person-template', data: seller }"></div>
<script id="person-template" type="text/html">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/javascript">
function MyViewModel() {
this.buyer = { name: 'Franklin', credits: 250 };
this.seller = { name: 'Mario', credits: 5800 };
}
ko.applyBindings(new MyViewModel());
</script>
</html>
Когда я обновил jQuery до версии 1.9, я получил следующую ошибку:
Uncaught TypeError: Object function (e,t){return new st.fn.init(e,t,X)} has no method 'clean'
Я был бы признателен, если бы кто-нибудь мог объяснить, есть ли ошибка в jQuery или KO.
2 ответа
Решение
Причина
Вы не используете самую последнюю версию Knockout. Предыдущая версия 2.2.0 несовместима с jQuery 1.9.x и выше. Смотрите эту тему:
Knockout 2.2.0 использует jQuery.clean(), который устарел и не существует в 1.9.
Это означает, что Knockout 2.2.0 вызывает неопределенный метод jQuery, вызывая указанную вами ошибку JS.
Решения
- Рассмотрите возможность обновления до последней версии Knockout, которая совместима с jQuery 1.9.
- Если вы не можете, используйте плагин jQuery Migrate, который добавляет обратную совместимость к jQuery 1.9
- Если ничего не помогает, вам нужно вернуться к jQuery 1.8
Обновление Knockout до 2.2.1 решает проблему для меня:
- 2.2.0: http://jsfiddle.net/UDSBC/2/
- 2.2.1: http://jsfiddle.net/UDSBC/1/
Так что просто поменяй:
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/2.2.0/knockout-min.js"></script>
Для того, чтобы:
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/2.2.1/knockout-min.js"></script>
И это сработает.