无法通过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);
});
");