Pjax. Не срабатывает js из подключаемого Asset

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
zxczxc12
Сообщения: 144
Зарегистрирован: 2013.01.24, 21:16

Pjax. Не срабатывает js из подключаемого Asset

Сообщение zxczxc12 »

Hi

Немогу понять как так.

Делаю пошаговую регистрацию с применением Pjax.
На одном из шагов нужно выбрать страну и город , для этого использую js
js оформил в Asset и подключаю . Но когда загружается этот шаг с помощью Pjax, скрипт не срабатывает , но если на этом шаге обновить страницу F5 , то скрипт работает .

При этом если вставить js код в шаблон шага , то js срабатывает как надо и сразу, без принудительного обновления браузера.

Как сделать так что бы js из Asset подгружался/был активным ?

Спасибо !

Аватара пользователя
maleks
Сообщения: 1858
Зарегистрирован: 2012.12.26, 12:56

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение maleks »

походу в кеше он, поэтому не грузит заново.
Посмотрите как там файлу js в ассете можно политкорректно добавить типа такого '?random=' . time()
Yii2 universal module sceleton - for basic and advanced templates

Krash
Сообщения: 29
Зарегистрирован: 2016.04.19, 12:43

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение Krash »

А регистрировать js именно на нужном шаге не вариант? И что именно в js происходит? Работа с dom-элементами?

Аватара пользователя
demimurych
Сообщения: 20
Зарегистрирован: 2016.06.27, 01:58

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение demimurych »

pjax загружает только то что обернуто внутри PJAX контейнера.
Если вы оформили ассет только для этой страницы, и эта страница загружается pjax-ом то никакие скрипты загружены специально для нее не будут. Об этом нужно заботиться самому.
При этом если вы сделаете релоад страницы то естественно все отработает как надо.

Пример:
у вас есть страница для которой вы офорили ассет с jquery и pjax
пользователь открыл эту страницу - загрузилось jquery и pjax плагин

у вас есть вторая страница, для которой вы создали отдельный asset подгружающий нужные именно для этой страницы скрипты.
пользователь с первой страницы переходит на вторую при этом вторая страница подгружается PJAX-ом. Ни один asset у вас для второй страницы загружен не будет.

pavlm
Сообщения: 83
Зарегистрирован: 2013.09.02, 16:33

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение pavlm »

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

Аватара пользователя
demimurych
Сообщения: 20
Зарегистрирован: 2016.06.27, 01:58

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение demimurych »

pavlm писал(а):
2017.04.01, 20:55
несколько версий назад pjax научился подгружать скрипты после pjax-запроса, возможно стоит обновиться.
yii 2.0.11 pjax widget не имеет и намека кода на подгрузку js или любых других Js файлов.
сам по себе jquery pjax не обновлялся уже два года.

Будьте любезны покажите где именно в каком месте он научился подгружать?

Если вы о renderAjax то он никаким боком к pjax не относится.

pavlm
Сообщения: 83
Зарегистрирован: 2013.09.02, 16:33

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение pavlm »

demimurych писал(а):
2017.04.02, 01:31
pavlm писал(а):
2017.04.01, 20:55
несколько версий назад pjax научился подгружать скрипты после pjax-запроса, возможно стоит обновиться.
yii 2.0.11 pjax widget не имеет и намека кода на подгрузку js или любых других Js файлов.
сам по себе jquery pjax не обновлялся уже два года.
это откуда такая информация?
Будьте любезны покажите где именно в каком месте он научился подгружать?

Если вы о renderAjax то он никаким боком к pjax не относится.
вот https://github.com/yiisoft/jquery-pjax/ ... ax.js#L803 executeScriptTags выполняет скрипты в правильной последовательности

Аватара пользователя
demimurych
Сообщения: 20
Зарегистрирован: 2016.06.27, 01:58

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение demimurych »

pavlm писал(а):
2017.04.02, 02:14

это откуда такая информация?


Вот отсюда, из основного репозитария Jquery pjax
https://github.com/defunkt/jquery-pjax

Посмотрите в реадме того же репозитария что Вы дали. Там одни баг фиксы.


Далее
pavlm писал(а):
2017.04.02, 02:14

вот https://github.com/yiisoft/jquery-pjax/ ... ax.js#L803 executeScriptTags выполняет скрипты в правильной последовательности
Это код который выполняет скрипты которые были включены инлайнон в pjax контейнер
типа
<?php Pjax::begin() ?>
<script src="/js/myscript">
мой штмль код
<?php Pjax::end(); ?>
и никакого отношения к выполнению скриптов добавленных asset-тами к странице не имеет. Или любым другим registerJsFile.

Если Вы посмотрите в код PJAX виджета вы увидите, что никакого функционала подключения таких вещей там нет в принципе.

pavlm
Сообщения: 83
Зарегистрирован: 2013.09.02, 16:33

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение pavlm »

demimurych писал(а):
2017.04.02, 02:24
pavlm писал(а):
2017.04.02, 02:14

это откуда такая информация?


Вот отсюда, из основного репозитария Jquery pjax
https://github.com/defunkt/jquery-pjax

Посмотрите в реадме того же репозитария что Вы дали. Там одни баг фиксы.


Далее
pavlm писал(а):
2017.04.02, 02:14

вот https://github.com/yiisoft/jquery-pjax/ ... ax.js#L803 executeScriptTags выполняет скрипты в правильной последовательности
Это код который выполняет скрипты которые были включены инлайнон в pjax контейнер
типа
<?php Pjax::begin() ?>
<script src="/js/myscript">
мой штмль код
<?php Pjax::end(); ?>
и никакого отношения к выполнению скриптов добавленных asset-тами к странице не имеет. Или любым другим registerJsFile.

Если Вы посмотрите в код PJAX виджета вы увидите, что никакого функционала подключения таких вещей там нет в принципе.
defunkt? не туда смотрите.
Конечно, в самом виджете не найти подключения скриптов, но там есть вызов метода который это подключение делает.
У меня, например, работает подгрузка скриптов через ассеты, и вышеупомянутая js-функция гарантирует правильный порядок выполнения.

Аватара пользователя
demimurych
Сообщения: 20
Зарегистрирован: 2016.06.27, 01:58

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение demimurych »

pavlm писал(а):
2017.04.02, 03:14
defunkt? не туда смотрите.
Приехали.
По ссылке что Вы дали, идет репозиторий Jquery.Pjax плагина в YiiSoft ветке где черным по белому написано
forked from defunkt/jquery-pjax
Если открыть сам Js файл и посмотреть заголовок там черным по белому написано
https://github.com/defunkt/jquery-pjax

Если открыть ChangeLog форка можно увидеть, что все что менялось относительно ОСНОВНОГО репозитария это БАГФИКСЫ.
почему? потому что основной разработчик крайне медленно стал реагировать на критически важные баги. А сейчас и вовсе оставил проект без присмотра. Потому было принято решение форкнуть и внести исправления своими руками.
pavlm писал(а):
2017.04.02, 03:14

Конечно, в самом виджете не найти подключения скриптов, но там есть вызов метода который это подключение делает.
У меня, например, работает подгрузка скриптов через ассеты, и вышеупомянутая js-функция гарантирует правильный порядок выполнения.
Приехали 2.
вы прежде чем говорить заглянули бы в код виджета

Код: Выделить всё

if ($this->requiresPjax()) {
            ob_start();
            ob_implicit_flush(false);
            $view = $this->getView();
            $view->clear();
            $view->beginPage();
            $view->head();
            $view->beginBody();
            if ($view->title !== null) {
                echo Html::tag('title', Html::encode($view->title));
            }
        }
Вам нужно прокомментировать этот код? Или сами догадаетесь как он работает и что означает $view->clear(); ?

У вас работать ничего не могло, кроме одного _ЧАСТНОГО_ случая, если вы по ошибке подключение asseта сделали внутри PJAX контейнера. т.е. сделали что-то вроде

Код: Выделить всё

<?php Pjax::begin(); ?>
<?php AppAsset::register($this); ?>
<?php Pjax::end(); ?>
сначала объявили старт работы виджета, а уже после его старта сделали инициализацию ассета. В результате чего вы получили ситуацию, когда вы на pjax реквест страницы загружали все ассеты вставленные в PJAX контейнер страницы. Причем у вас это работало ТОЛЬКО для JS части ассета. Все же CSS из вашего ассета благополучно резались.
Как результат Ваш код корректно отрабатывал только для случаев отсутствия CSS в ассете в совокупности с корректной работы скриптов относительно меняющегося DOM. Поскольку повторная загрузка одного и того-же скрипта таким способом невозможна в силу специфики Jquery.PJAX плагина.

Смотрите чаще в исходный код, да не просто смотрите а разбирайтесь как он работает.

pavlm
Сообщения: 83
Зарегистрирован: 2013.09.02, 16:33

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение pavlm »

Это какой-то бессмысленный флуд.
Вот была ваша фраза:
demimurych писал(а):
2017.04.01, 16:44
Если вы оформили ассет только для этой страницы, и эта страница загружается pjax-ом то никакие скрипты загружены специально для нее не будут. Об этом нужно заботиться самому.
Я написал, что это ложное утверждение, т.к. pjax может подгружать скрипты.
Да, при этом надо регистрировать ассет внутри вызовов pjax (но это уже детали).
Какието ваши "ченджлоги, обрезка CSS, повторная загрузка скрипта... " это уже все дикий оффтопик.

Аватара пользователя
maleks
Сообщения: 1858
Зарегистрирован: 2012.12.26, 12:56

Re: Pjax. Не срабатывает js из подключаемого Asset

Сообщение maleks »

demimurych писал(а):
2017.04.02, 07:56
сначала объявили старт работы виджета, а уже после его старта сделали инициализацию ассета. В результате чего вы получили ситуацию, когда вы на pjax реквест страницы загружали все ассеты вставленные в PJAX контейнер страницы. Причем у вас это работало ТОЛЬКО для JS части ассета. Все же CSS из вашего ассета благополучно резались.
Да ничего там не резалось. CSS-ы обычно идут файлами и они все подключились при первой загрузке страницы и с тех пор работают, по аяксу их догружать нет потребности. А js подгружается т.к. надо стартовые скрипты перезапускать на новых элементах(полученных аяксом) - для форм, да и для GridView даже.
Yii2 universal module sceleton - for basic and advanced templates

Ответить