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

无法通过clientScript注册普通函数->;yii中的registerScript,yii,Yii,我正在通过onchange调用一个简单的javascript函数 echo $form->dropDownList($model, 'job_title', $jobTypes, array('onchange'=>'jobTitle(this);')); ?> 正在尝试通过clientScript->registerScript Yii::app()->clientScript->registerScript('jobTitle', " function

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

echo $form->dropDownList($model, 'job_title', $jobTypes, array('onchange'=>'jobTitle(this);')); ?>
正在尝试通过
clientScript->registerScript

Yii::app()->clientScript->registerScript('jobTitle', "
    function jobTitle(e) {
        alert('e');
    }
");

但是我得到一个错误,
jobTitle
没有定义

原因:

由于是
CClientScript::POS_READY
,生成的js是:

jQuery(function($) {
    // ... there could be some other yii scriptlets too ...
    function jobTitle(e) {
        alert('e');
    }
});
这意味着您的函数
jobTitle
仅在
jQuery()中可用函数范围,而不是从它的外部,这就是为什么会出现未定义的错误

解决方案1:

如果您将位置:
CClientScript::POS_HEAD
CClientScript::POS_BEGIN
CClientScript::POS_END
与您的
registerScript
调用一起使用,即:

Yii::app()->clientScript->registerScript('jobTitle', "
    function jobTitle(e) {
        alert('e');
    }
", CClientScript::POS_END);
该函数将在外部和全局范围内定义,然后您将能够使用该函数

解决方案2:

或者,如果您需要内的函数,即
jQuery(函数($){})内的函数,您可以在全局窗口对象中定义函数,并且仍然可以从外部访问它:

Yii::app()->clientScript->registerScript('jobTitle', "
    window.jobTitle = function jobTitle(e) {
        alert('e');
    }
");
解决方案3:

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

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