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

时间:2013-02-26 01:59:29

标签: yii

我通过onchange

调用一个简单的javascript函数
echo $form->dropDownList($model, 'job_title', $jobTypes, array('onchange'=>'jobTitle(this);')); ?>

尝试通过jobTitle

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

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

1 个答案:

答案 0 :(得分:13)

原因:

由于default positionCClientScript::POS_READY,生成的js为:

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

这意味着您的函数jobTitle仅在jQuery();函数范围内可用,而不在其外部,这就是您得到未定义错误的原因。

解决方案1:

如果您使用CClientScript::POS_HEADCClientScript::POS_BEGINCClientScript::POS_END与您的registerScript电话合作,即:

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

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

解决方案2:

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

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);
    });
");