И снова рубрика "помогите починить"

InstantCMS 2.X
#1 15 марта 2025 в 00:47

Всем доброго. Очевидно, никто не любит чинить чужие компоненты, но вдруг найдутся желающие размять мозги. 

Есть купленный компонент UpJump — продвижение записей. После обновления на 2.17 перестал работать (автор удалился с форума, к нему вопросов нет, поскольку компонент шел «как есть», без поддержки). Так вот, после нажатия на кнопку «продвижение» кнопка просто зависает и модалка с опциями продвижения не открывается. В консоли браузера в этот момент выдает ошибку:

Uncaught TypeError: $.parse is not a function
    at Object.<anonymous> (upjump.js?1660154113:4:20)
    at c (jquery.js?1660154113:2:25266)
    at Object.fireWith [as resolveWith] (jquery.js?1660154113:2:26015)
    at l (jquery.js?1660154113:2:77721)
    at XMLHttpRequest.<anonymous> (jquery.js?1660154113:2:80204)

Гугл выдал варианты возникновения ошибки, но мне не хватает знаний, чтобы понять в чем причина. Ищу помощи здесь и заранее благодарю за ответы. Вы очень помогаете!

#2 15 марта 2025 в 01:27

Что это за компонент такой, 0 рубликов но «Купить»?

Изображение

Сложно сказать не имея его.

#3 15 марта 2025 в 14:07
Что это за компонент такой, 0 рубликов но «Купить»? Сложно сказать не имея его.
pupsik

Долгая история. Автор устроил складчину на выкуп компонентов, она не состоялась, участникам рассылали компонент на выбор. Потом закрыл продажи. 

Ну не суть, компонент хотелось бы починить, иначе получается деньги на ветер, так и не воспользовался им. А он важен. 

Сегодня в 15:20
#4 15 марта 2025 в 15:22

 Ostrova, у автора было 7 пятниц на неделе, в итоге он всё бросил видимо.

без компонента Вам не помогут, возможно и с компонентом не помогут, но стоит попробовать

#5 15 марта 2025 в 17:01
 Ostrova, у автора было 7 пятниц на неделе, в итоге он всё бросил видимо. без компонента Вам не помогут, возможно и с компонентом не помогут, но стоит попробовать
Александр

Я готов предоставить компонент, если Fuze позволит. 

#6 15 марта 2025 в 17:07

 Ostrova, если получится обновить, маякните. 

#7 Вчера в 21:15

Что ж, интересная развязка истории. Раз уж вариантов решения не поступало, решил сформулировать вопрос правильно и задать его DeepSeek. Вот его внутренние размышления, а далее ответ:

Хорошо, давайте разберемся с проблемой. Пользователь обновил InstantCMS до версии 2.17, и теперь при нажатии на кнопку в компоненте Upjump возникает ошибка `Uncaught SyntaxError: "[object Object]" is not valid JSON` в файле `upjump.js`. Нужно понять, почему это происходит именно после обновления CMS.

Первым делом смотрю на предоставленный код `upjump.js`. Ошибка возникает при попытке парсить JSON из ответа сервера. В нескольких местах используется `$.parseJSON(response)` или `JSON.parse(response)`. В новой версии InstantCMS, возможно, изменился формат ответов сервера или способ отправки данных.

Замечаю, что в функции `loadForm` есть строка `result = $.parseJSON(response);`. Если сервер возвращает уже объект JSON, а не строку, попытка парсить его вызовет ошибку. Но раньше, возможно, ответ приходил в виде строки, а теперь приходит объект, из-за чего парсинг не нужен. Это частая проблема при обновлении библиотек или CMS, где методы обработки AJAX могут автоматически парсить JSON, если заголовок ответа правильный.

Также в других функциях, например, `upjumpBuy` и `calculate`, используется аналогичный подход. Если в InstantCMS 2.17 jQuery настроен на автоматическое распознавание JSON (через `dataType: 'json'`), то `response` уже будет объектом, и попытка его парсить вызовет ошибку.

Проверяю, есть ли в AJAX-запросах указание `dataType: 'json'`. В функции `calculate` и `upjumpBuy` используется `$.ajax` без указания `dataType`, поэтому jQuery пытается сам определить тип ответа. Если сервер теперь отправляет правильный заголовок `Content-Type: application/json`, jQuery автоматически парсит ответ в объект, и последующий `$.parseJSON` будет пытаться парсить объект, что приводит к ошибке.

Еще один момент: в InstantCMS 2.17 могли обновить версию jQuery. Если раньше использовалась версия, где `$.post` не парсил JSON автоматически, а теперь используется версия с другим поведением, это может вызвать проблему. Например, если в ответе сервера отсутствует заголовок, указывающий на JSON, jQuery раньше возвращал строку, а теперь может пытаться парсить ее как JSON, если `dataType` не указан явно.

Также стоит обратить внимание на функцию `upjumpUpdElems`, которая использует `fetch` и `DOMParser`. Возможно, изменения в безопасности или политиках CORS в новой версии браузеров или CMS мешают корректной работе этой функции, но это менее вероятно связано с JSON-ошибкой.

Итак, основная проблема, скорее всего, в том, что ответ от сервера теперь приходит уже в виде JSON-объекта, а код компонента пытается его повторно парсить. Нужно убрать вызовы `$.parseJSON` там, где это не требуется, и убедиться, что AJAX-запросы правильно обрабатывают тип данных.

и ответ

Ошибка Uncaught SyntaxError: "[object Object]" is not valid JSON возникает из-за попытки парсить объект как JSON-строку. Скорее всего, в новой версии InstantCMS 2.17 изменился формат ответов сервера или обновились зависимости (например, jQuery), что привело к конфликту с кодом компонента Upjump. Давайте разберемся детально.

 
Основная проблема
В коде upjump.js есть несколько мест, где используется $.parseJSON(response) или неявный парсинг JSON. Однако, если сервер уже возвращает готовый JavaScript-объект (а не строку), эти вызовы становятся избыточными и вызывают ошибку. Вероятно, в InstantCMS 2.17:

Ответы сервера теперь автоматически парсятся в объект (например, из-за правильного заголовка Content-Type: application/json).
jQuery или InstantCMS изменили обработку AJAX-ответов.
 
Конкретные места в коде
Функция loadForm:

javascript
Copy
$.post(...).done(function(response) {
    result = $.parseJSON(response); // Ошибка здесь, если response уже объект
});
Если response — это объект (не строка), $.parseJSON попытается вызвать JSON.parse("[object Object]"), что и вызывает ошибку.
Функции upjumpBuy, calculate, upjumpFree:
Аналогичная проблема с $.parseJSON(response).
 
Почему проявилось в InstantCMS 2.17?
Изменения в ядре CMS: В новой версии InstantCMS могла появиться автоматическая обработка JSON-ответов (например, через хедер Content-Type), из-за чего response перестал быть строкой.
Обновление jQuery: Если InstantCMS 2.17 использует новую версию jQuery, метод $.post() мог начать автоматически парсить JSON при наличии правильного заголовка.
Изменения в API: Серверный компонент /upjump/… мог начать возвращать данные в другом формате.
 
Решение
Убрать лишний $.parseJSON:
Если сервер возвращает уже распарсенный объект, замените:

result = $.parseJSON(response);

result = response; // Если response уже объект

Ну и далее много всего, но мне хватило этой информации. В общем заменил в Upjump.js

result = $.parseJSON(response);
на:

result = response; // Если response уже объект

Все заработало. Спасибо ИИ. 

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.