Вот такая ошибка возникает
Uncaught TypeError: jQuery(...).last().animateCss is not a function rcl_notice /wp-content/plugins/wp-recall/assets/js/core.js?ver=16.24.29:242 <anonymous> /2346-2/?una_filter=publications:527 core.js:242:39
скрин:
Нотис использует ссылку в сообщении
и видимо скрипт не учитывает дополнительные теги в нотисе
в 6-ти дополнениях без события ready использовал.
Может в ядре плагина лучше проверку ввести на 242 строке:
if ( typeof animateCss !== 'undefined' ) { jQuery( '#rcl-notice > div' ).last().animateCss( 'slideInLeft' ); }
6 допов прекрасно нотис показывают. Ну а то что не будет анимации - не страшно.
Функция ниже rcl_close_notice тоже использует animateCss - но ей фикс не нужен этот. Проверил - отрабатывает. Только 242 строку подбить с проверкой и будет норм.
Дело в том, что js позволяет переопределять функцию, а значит rcl_notice может быть переопределена после того как у тебя она вызывается, в итоге отработает старая функция. По этому на мой взгляд правильно использовать вывоз rcl_notice после того как документ будет готов и все скрипты сформировались.
Поясни - какая проблема может возникнуть в ядре плагина - если функция проверяет наличие готовности .animateCss()
?
Отбросим то, что у меня допы rcl_notice показывают. Правда без анимации. А вот плагин не готов к этому. А если кто-то .animateCss() уберет/переопределит/грохнет? Значит что плагин готов будет к этому - потому как есть проверка на готовность .animateCss()
Многие разрабы ломают своими действиями казалось бы верную работу фреймворка - и в фреймворк вносят коррективы чтоб работало стабильней. Темболее rcl_notice работало как часы всегда. А "обвес" к ней сломался.
Preci сказал(а)
решать Андрею
это да. Я лишь за диалог
Например в доках по добавлению метода в jquery
- не вешают на ready - он просто идет после jquery. Так и скрипт core.js имеет в зависимостях jquery
wp_enqueue_script( 'rcl-core-scripts', RCL_URL . 'assets/js/core.js', array( 'jquery' )
- а значит и так будет загружен после. Ему событие ready и не требуется. Если разбираться дальше - где я не прав?
Ну кроме того что сейчас после полсотни обновлений из-за обнов плагина еще 6-ть допов обновлять - мне лень. шестеро одного не ждут?
Я убрал проверку на undefined - получил ошибку. Потом в core.js убрал всю строку с ready на 7й строке и строку ниже так сделал: jQuery.fn.extend( {
- и ниже все как было. Итог - анимация появилась. js ошибка в консоли исчезла.
Ну так ты написал про одну проблему, предложил решить ее проверкой - я сказал что так не мой взгляд не хорошо.
А теперь ты говоришь о том, что бы расширять методы jQuery не после готовности документа, а сразу. Это уже другой вопрос.
Да, это решит проблему, но не отменяет того факта, что если кто-то после твоего кода переопределит rcl_notice, например для другого внешнего вида или еще чего - твой код вызовет стандартную функцию. По этому я и говорю что на мой взгляд обернуть rcl_notice в ready будет правильно не зависимо от того вызовет он ошибку animateCss или нет
Preci сказал(а)
я сказал что так не мой взгляд не хорошо
не хорошо делать проверку "есть ли готовность метода"? Который сами и ввели, но поздней. т.е. функция сама уже в области видимости, а метод в ней - нет. Не находишь не корректно говорить - "у себя исправляй"? 6-ть раз...
Preci сказал(а)
Это уже другой вопрос.
не другой вопрос - а второй подход к решению маленькой несостыковки. Вопрос все тот же решает.
Preci сказал(а)
обернуть rcl_notice в ready будет правильно
почему ready? А если придет js-ник и замутит так что метод будет после DOMContentLoaded или load или window.onload или еще позже? (я не помню без гуглежа порядок этих событий - но чтото тут есть и позже ready)
Мы пишем под фреймворк, а не под что-то возможно, когда-то. Апи дает реколл. Его и использую.
Поломать переписать js функцию могут кто угодно и как угодно (а я не против что старый нотис выйдет - я под него и пишу). Писать в 6-ти допах лишние байты когда и так работает...
Использовать в исправлении фреймворка любой из описанных мною фиксов - это лучшее решение. Почему я должен нагромождать свой код проверками и думать что вдруг кто-то на каком-то там событии подменит функцию. Я и так знаю что мой js грузится позже зависимого.
Ок - я, видя что функция в core.js, зарегистрирую свой js с зависимостью от этого скрипта - это вроде right way wordpress. Но вот оказывается что её кто-то где-то изменил? Ну значит я буду работать именно с родной - от фреймворка. И не писать лишние байты. И не выпускать обновления допов своих просто от того что в ядре функция в области видимости, а метод что ядро само зарегило - нет...
В общем я спорю по совету "мне использовать лишние обертки".
Мне не важно как эта проблема будет решена, проверкой, регистрацией метода для jquery до готовности документа или еще как. Я написал что на мой взгляд, логичнее использовать вызов rcl_notice после готовности документа, независимо от ошибки animateCss. А дальше уже тебе решать.
Снова я с похожей ошибкой:
Все сторонние дополнения отключены. Только ядро плагина и его базовые дополнения. Реколл 16.24.31. ВП тема по дефолту Twenty Twenty Версия: 1.6. WordPress 5.6
Захожу в вкладку "Профиль" и выходит эта же ошибка.
может быть проблема в том что загружая вкладку "Профиль" повторно загружается и jQuery скрипт на 87 килобайт
- а это неверно же - у нас есть уже jquery библиотека на странице когда страница загружается. Но переход на вкладку "Профиль" вновь её тянет. Это же неправильно - лишний запрос к тому что есть. Да и такой массивный файл тянет
На этом скрине видно
что надпись JQMIGRATE: Migrate is installed, version 3.3.2 идет дважды. Первый раз когда страница ЛК загрузилась, а второй раз как раз из-за неверной повторной загрузки вместе с вкладкой "Профиль".
Скорей всего проблему повторить сможете есть в полях профиля доп поля поставите через админку - Поля профиля: у меня это тип поля "Файл" и Файловый загрузчик - они загружают jquery всякие зависимости
Быстрый фикс это конечно так на 110-й строке в scripts.js
if ( typeof animateCss !== 'undefined' ) { jQuery( '#lk-content' ).animateCss( 'fadeIn' ); }
Фикс в плагине мне критичен - т.к. в этой теме уперлись в него
- причина та же как и вкладке "Профиль" загружается повторно jQuery скрипт и видимо событие ready тут дает сбой и метод .animateCss не определен ещё. Фикс выше - устраняет ошибку и там и тут.
p.s. но что-то стремно еще и от того что jquery повторно грузится. Может его в список исключений как то вписать? Учитывая что он у нас и так в ЛК есть всегда
Сталкивался кучу раз с этой проблемой во вкладке Профиль.
При ее открытии у нее в контент подключаются нужные скрипты для работы вкладки, что бы не грузить их на всех вкладках. В коде recall я видел наработки на то, что бы при открытии вкладки вместе с ответом приходили требуемые скрипты для работы вкладки и затем уже их подключать, но это видимо недоделано.
Если сейчас просто во вкладке Профиль убрать вывод скриптов - то тогда ее надо делать без ajax поддержки. Или же вместо добавления скриптов в содержимое вкладки, добавить туда вызов какой либо функции, с передачей в нее скриптов. А эта функция уже будет проверять, если нужных скриптов нет - подключать их, если есть - игнорировать
мой фикс решит ошибку с том месте скрипта и в вкладке профиль и вкладке которую вызывает мой доп с лоадером изображения.
А вот если просто ограничиться подгрузкой вкладки профиль не через ajax - то это не решит мой вопрос с ошибкой.
По повторной загрузке jquery - пока можно и закрыть глаза на это. Хотя и откладывать надолго нельзя.