Yii2: как вызвать yiiActiveForm() вручную?

В yii2 я поместил весь свой js-код в 1 файл, используя yii2-assets-auto-compress< /strong> плагин, включая jQuery lib. Загрузка этого файла async для ускорения загрузки страницы. Но, если на странице есть формы, yii добавляет yiiActiveForm() в конце </body>. Итак, ошибка jQuery is not defined.

Как справиться с этой проблемой? Во-первых, я могу сделать вызов yiiActiveForm() вручную из script.js, но как отключить автоматическую загрузку в конце тела? Как правило, это неудобно, потому что могут быть другие скрипты, которые добавляют код js. Может быть, кто-то знает, как добавить код js с помощью этого плагина yii2-assets-auto-compress?

<script src="/assets/js-compress/script.js?" async="async"></script>
<script type="text/javascript">
jQuery(document).ready(function () {
    jQuery('#w0').yiiActiveForm([],[]);
});
</script>
</body>

person sirjay    schedule 17.03.2018    source источник


Ответы (1)


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

  • Вы должны либо загрузить Jquery вне ваших сжатых скриптов внутри головы.
  • Или загрузить сценарий внутри <head> документа означает внутри файла макета либо с помощью тегов скрипта

    <script type="text/javascript" src="/path/to/compressed.js" async="async"></script>

    или используя

    <?php $this->registerJsFile('/path/to/compressed.js',['aync'=>'aync'])?>

  • если вы используете AssetManager для загрузки файла скрипта

Затем загрузите его так

public $js = [
        ['js/compressed.js','async'=>'async','position' => yii\web\View::POS_HEAD],

    ];

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

'assetManager' => [
    'bundles' => [
          'yii\web\JqueryAsset' => [
              'sourcePath' => null, 
              'js'=>[]
           ],
     ],
 ],

HERE — это хорошо читать.

person Muhammad Omer Aslam    schedule 17.03.2018
comment
Спасибо за ответ! Я изменил async на defer, но ошибка была та же. Вроде defer не помогает. - person sirjay; 17.03.2018
comment
@sirjay, можете ли вы предоставить ссылку на файл сценария, который вы используете, чтобы я мог проверить на своем конце, и вы сказали, что включили jquery в этот сжатый файл, отключили ли вы основной сценарий для jquery? в целом сайт убедитесь, что он не загружается дважды, и как вы включаете этот файл, используя активы? - person Muhammad Omer Aslam; 17.03.2018
comment
Скрипт, который я использую для сжатия: github.com/skeeks-semenov/yii2-assets. -auto-compress, мой сайт arprime.ru для проверки ошибки - person sirjay; 17.03.2018
comment
извините, я неправильно истолковал логику здесь, извините за то, что вы можете использовать async здесь, но вам нужно загрузить файл внутри <head>, я обновил свой ответ @sirjay - person Muhammad Omer Aslam; 18.03.2018
comment
Привет! К сожалению, это не помогло. Я установил загрузку js на <head> и установил async. Это означает, что это не зависит от того, ставите ли вы <head> или <body> - person sirjay; 22.03.2018