在Yii2框架中,使用Ajax弹出窗口(通常通过模态框实现)时,有时会遇到JavaScript脚本未加载的问题。这是因为Yii2的PJAX(PushState + Ajax)机制或Ajax请求默认不会加载页面中的JS脚本。
<script>
标签// 在控制器中
public function actionModalContent()
{
$this->registerJs("
// 你的JS代码
console.log('Modal JS loaded');
");
return $this->renderAjax('_modal');
}
$.ajax({
url: '/controller/modal-content',
success: function(data) {
$('#modal-container').html(data);
// 手动查找并执行脚本
$('#modal-container').find('script').each(function() {
$.globalEval(this.text || this.textContent || this.innerHTML || '');
});
}
});
// 在布局文件中
\yii\widgets\Pjax::widget([
'id' => 'pjax-container',
'enablePushState' => false,
'clientOptions' => [
'skipOuterContainers' => true,
'container' => '#pjax-container',
'fragment' => '#pjax-container'
]
]);
// 主JS文件中
$(document).on('click', '.modal-trigger', function() {
// 处理模态框逻辑
});
// 或者使用Yii2事件
$(document).on('pjax:success', function() {
// 重新绑定事件
});
$(document).on()
绑定事件,而不是直接绑定AssetBundle
来管理JS资源// 创建AssetBundle
class ModalAsset extends \yii\web\AssetBundle
{
public $js = [
'js/modal.js',
];
}
// 在控制器中
public function actionModal()
{
ModalAsset::register($this->view);
return $this->renderAjax('_modal', [
// 传递数据
]);
}
// js/modal.js
$(document).on('ready pjax:success', function() {
$('body').on('click', '.modal-trigger', function() {
$.ajax({
url: $(this).data('url'),
success: function(data) {
$('#modal').html(data).modal('show');
}
});
});
});
通过以上方法,可以确保在Yii2的Ajax弹出窗口中正确加载和执行JS脚本。
没有搜到相关的文章