引用错误: $ 未定义 yii2

2022-08-30 13:33:32

在我的视图中添加 javascript 会导致 .我假设问题是由于Yii2在我的页面上最后注入脚本。如何解决这个问题?ReferenceError: $ is not defined

或者如何防止 Yii2 自动加载脚本文件?

我的观点

  <?php

   use yii\helpers\Html;
   use yii\helpers\ArrayHelper;
   use yii\helpers\UrlManager;
   use yii\widgets\ActiveForm;
   use backend\controllers\StandardController;

   use backend\models\standard;


   ?>

 <div class="domain-form">

<?php $form = ActiveForm::begin(); ?>

<?php



    <?= $form->field($model, 'clause')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'name')->textarea(['rows' => 6]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

   </div>

    <script type="text/javascript">
    $("document").ready( function () {
    alert("hi");
    });</script>

我需要获取这个简单的脚本,以便在页面加载后显示警报。我没有在这里调用任何脚本文件,因为yii通过调用在布局中自动加载(我认为)

  AppAsset::register($this);

这导致脚本文件在我的自定义脚本之后,在页面末尾注册。

如何解决这个问题?


答案 1

Yii2 在你的页面上最后注入脚本(jquery 等)。这是有意和期望的。但这意味着jQuery将在脚本之后加载,因此当您的脚本运行时,jQuery尚不存在。

快速测试的最简单方法是将 yii 脚本(jquery 等)移动到页面的头部。修改并添加以下内容:assets\AppAsset.php

public $jsOptions = array(
    'position' => \yii\web\View::POS_HEAD
);

做!


但是在生产中,你通常希望脚本最后加载,而是让 Yii2 处理你的 javascript:

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

现在 Yii 将处理这个 js,并将其放在任何重要的东西(如 jQuery)之后。

但是,您很快就会注意到IDE通常不擅长处理这种语言嵌套(PHP中的JavaScript),因此语法突出显示可能会中断。解决它的一种方法是在单独的文件中注册脚本:

$this->registerJsFile( 'myScript.js' );

如果要更好地控制加载脚本的顺序,可以添加依赖项作为第二个参数,添加其他选项作为第三个参数:

$this->registerJsFile( 
    'myScript.js', 
    ['\backend\assets\AppAsset'],  
    ['position' => '\yii\web\View::POS_END']
);

如果出于某种原因,您绝对希望以内联方式呈现脚本,则可以执行以下操作:

$this->registerJs( $this->renderPartial('myScript.js') );

添加脚本的推荐方法是使用资产捆绑包。查找并将 js 文件添加到$js数组中。assets/AppAssets.php


答案 2

每当您需要一些资源用于库的特定用途时,请在视图文件中注册它们,如下所示:

use yii\web\JqueryAsset;
JqueryAsset::register(this);

或者,如果您添加到内部的属性,则所有视图的资产都将自动加载,前提是您在主布局中注册了它(默认情况下在 Yii2 样板中)。yii\web\JqueryAsset$dependsAppAsset

我想在我的项目中使用kartik-v的yii2-date-range,并这样做了:

use kartik\daterange\DateRangePicker;
use kartik\daterange\MomentAsset;
use yii\web\JqueryAsset;

JqueryAsset::register(this);
MomentAsset::register(this);
...
echo DateRangePicker::widget([ 
    'model' => $model, 
    ...
]);

由于我切换到了树枝模板,因此在我看来,我最终得到了以下代码:

{{ use('kartik/daterange/DateRangePicker') }}
{{ use('kartik/daterange/MomentAsset') }}
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
{{ register_moment_asset() }}
...
{{ date_range_picker_widget({ 
    'model': model, 
    ...
   }) }}

推荐