4

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

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未定义的错误......

4

1 回答 1

13

原因:

默认位置为,CClientScript::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_BEGINorCClientScript::POS_END与您的registerScript电话,即:

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

该函数将在外部和全局范围内定义,然后您将能够使用该函数。

解决方案2:

或者,如果您需要函数 within ready(),即 within 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);
    });
");
于 2013-02-26T02:48:19.143 回答