我知道这个问题在这里和Yii网站上被多次询问过,但即使在完成每个解决方案之后我都没有得到解决方案。我确信我做的事情从根本上是错误的。所以,如果你还在读这个 - 这里什么都没有,
我有一个正在加载CheckBoxList小部件的页面。它有一个change()jQuery函数调用,刷新一个完美运行的CGridView。我还有一个与checkBoxList中具有click事件的每个项相关的span。
此点击事件依次调用“部分呈现”视图的控制器 -
Yii::app()->clientscript->scriptMap['jquery.js'] = false;
$this->widget('ext.xxx.EModelWidget', array(
'name' => $widget_name,
'manufacturer_id' => $manufacturer_id,
)
);
相应的窗口小部件代码在从db获取$ data后打印CheckBoxList。
echo CHtml::checkBoxList($this->name, array(), $data, array(
'class' => 'modelFilter',
'separator' => '',
'template' => '<div>{input} {label}</div>',
'id' => 'dummyID',
));
正如您所看到的,我已将每个要呈现为复选框的元素的类名称设为 modelFilter
现在我在主视图文件中有一个脚本,只需在单击类modelFilter的checkBox时显示一个警告框。
Yii::app()->clientScript->registerScript('model-selected', "
$('input.modelFilter').change(function(){
alert('Hellpo!');
});
");
但不幸的是,这种情况从未发生过。
我在所有论坛中阅读的两个常见解决方案是
a) Yii :: app() - &gt; clientscript-&gt; scriptMap ['jquery.js'] = false; ,您可以看到我已正式关注。
b) $ result和$ processOutput参数的renderPartial分别为false和true。,这也是我所遵循的。
所以我的问题是我应该怎么做才能在通过Ajax工作的内容上获取更改功能,在Yii !!
答案 0 :(得分:7)
如果我理解正确,您在加载复选框列表之前调用$('input.modelFilter').change()
。像这样使用事件处理程序不会绑定到调用后插入的任何元素。
您必须使用委派事件而不是直接绑定事件。请查看:http://api.jquery.com/on/(搜索“直接和委派活动”)
$("body_or_input_container").on("change", "input.modelFilter", function(e){
//callback
});
答案 1 :(得分:4)
我遇到了类似的问题,在我执行Ajax调用后返回部分渲染的HTML内部javascript(由Yii的CActiveForm自动生成)所有内容都被破坏,因为没有jQuery插件被识别了。
经过长时间的研究后,我发现部分是再次发送jQuery lib,它通过“遗忘”之前已经初始化的所有东西(特别是其他插件,在我的例子中是UI对话框)重新初始化自己。 唯一的解决方法是告诉Yii不要在部分中包含jQuery.js本身,而是包含其他JS文件。
所以把它放在部分的开头。
Yii::app()->clientscript->scriptMap['jquery.js'] = false;
请注意,您必须配置为在页面加载时加载jQuery一次。
答案 2 :(得分:0)
好的,对于我发现的解决方案,无论是意外,是在部分呈现的文件中包含部分呈现文件的jQuery脚本。
我想知道这种风格是否正确。
答案 3 :(得分:0)
在eye renderPartial的情况下,它会破坏现有的javascript对象
e.g
我有一个带有欧芹j验证的表单,当我们使用render()但它不能识别欧芹对象时,它可以很好地工作。所以我们需要在我的情况下再次重新初始化对象
$( “#形式”)欧芹();