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_HEADまたはCClientScript::POS_BEGINまたはCClientScript::POS_ENDあなたのregisterScript呼び出しで、すなわち:

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

関数はグローバルスコープの外部で定義され、関数を使用できるようになります。

解決策2:解決策2:

ready()または、内、つまり内で関数が必要な場合jQuery(function($){});は、グローバルウィンドウオブジェクトで関数を定義し、外部からアクセスすることもできます。

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

解決策3:

または、htmlでインラインで行う代わりに、jQuery自体からイベントハンドラーを追加することもできます。

Yii::app()->clientScript->registerScript('jobTitle', "
    $('body').on('change', 'id-of-job-title-input', function(e){
        console.log(e);
    });
");
于 2013-02-26T02:48:19.143 に答える