无法通过yii中的clientScript-> registerScript注册普通函数

kee*_*eeg 4 yii

我正在调用一个简单的javascript函数 onchange

echo $form->dropDownList($model, 'job_title', $jobTypes, array('onchange'=>'jobTitle(this);')); ?>
Run Code Online (Sandbox Code Playgroud)

试图注册jobTitle通过clientScript->registerScript

Yii::app()->clientScript->registerScript('jobTitle', "
    function jobTitle(e) {
        alert('e');
    }
");
Run Code Online (Sandbox Code Playgroud)

然而,我收到一个jobTitle未定义的错误......

boo*_*dev 13

原因:

作为默认位置CClientScript::POS_READY,所产生的JS是:

jQuery(function($) {
    // ... there could be some other yii scriptlets too ...
    function jobTitle(e) {
        alert('e');
    }
});
Run Code Online (Sandbox Code Playgroud)

这意味着您的功能jobTitle仅在jQuery();功能范围内可用,而不是在外部,这就是您获得未定义错误的原因.

解决方案1:

如果您使用的位置:CClientScript::POS_HEADCClientScript::POS_BEGINCClientScript::POS_END与你registerScript通话,即:

Yii::app()->clientScript->registerScript('jobTitle', "
    function jobTitle(e) {
        alert('e');
    }
", CClientScript::POS_END);
Run Code Online (Sandbox Code Playgroud)

该函数将在外部定义,并在全局范围内定义,然后您就可以使用该函数.

解决方案2:

或者,如果您需要内部功能ready(),即内部功能jQuery(function($){});,您可以在全局窗口对象中定义该功能,并仍然可以从外部访问它:

Yii::app()->clientScript->registerScript('jobTitle', "
    window.jobTitle = function jobTitle(e) {
        alert('e');
    }
");
Run Code Online (Sandbox Code Playgroud)

解决方案3:

或者你可以简单地从jQuery本身添加一个事件处理程序,而不是在html中内联它:

Yii::app()->clientScript->registerScript('jobTitle', "
    $('body').on('change', 'id-of-job-title-input', function(e){
        console.log(e);
    });
");
Run Code Online (Sandbox Code Playgroud)