Yii2 зарегистрировать код js в представлении

каков наилучший способ регистрации кода js в представлении yii2?

1

<?php
    $this->registerJs(
    '$("document").ready(function(){ alert("hi"); });'
    );
  ?>

2

<?php 
     $this->registerJs('alert("hi");', View::POS_READY);
?>

3

<?php 
  $script = "function test() { alert('hi');}";    
  $this->registerJs($script, View::POS_END, 'my-options'); 
?>

4 ответов


Yii2, напишите код в представлениях

<h2>Content</h2>
<?php
$script = <<< JS
    alert("Hi");
JS;
$this->registerJs($script);
?>

<?php 
$this->registerJs( <<< EOT_JS_CODE

  // JS code here

EOT_JS_CODE
);
?>

таким образом, вам не нужно избегать JS-кода

https://www.yiiframework.com/doc/guide/2.0/en/output-client-scripts


Я создал тривиальный виджет, который позволяет мне поддерживать код в чистоте и разрешать правильный синтаксический анализ IDE.

общие / виджет / InlineScript.в PHP

<?php namespace common\widgets;

/**
 * Easily add JS to the end of the document.
 */
class InlineScript {

    /**
     * Open output buffer.
     */
    public static function listen() {
        ob_start();
    }

    /**
     * Capture the output buffer and register the JS.
     *
     * @param   yii\web\View    $view   The view that should register the JS.
     */
    public static function capture($view) {
        $view->registerJs(preg_replace('~^\s*<script.*>|</script>\s*$~ U', '', ob_get_clean()));
    }

}

пример использования (в поле зрения)

<?php ob_start(); ?>
    <script>
        alert('asd');
    </script>
<?php $this->registerJs(preg_replace('~^\s*<script.*>|</script>\s*$~ U', '', ob_get_clean())) ?>

как вы видите, это использует выходные буферы, поэтому нужно быть осторожным в использовании этого. Если каждый listen() не следует exaclty one capture() вы можете попасть в кошмар отладки:)


Я предпочитаю использовать виджет richardfan:

use richardfan\widget\JSRegister;

 <?php JSRegister::begin(['position' => static::POS_BEGIN]); ?>
        <script>
           alert('Hello world');
        </script>
<?php JSRegister::end(); ?>