我正在使用Js帮助程序来帮助我将index.ctp中“div”的内容替换为另一个文件changeto.ctp的内容。
此应用程序有一些带有相应图像的复选框。当我选中一个复选框时,该设置将存储在数据库中,并显示相应的图像。同样,当取消选中时,它将从数据库中删除,图像应该消失。
我正在使用Js助手:
我的changeto.ctp是我的index.ctp的子集,可以访问相同的变量和加载而没有任何问题(除了没有响应任何点击/更改事件。复选框的ID的名称完全相同)。
我的索引文件在所有Html底部包含以下Js代码:
$this->Js->get($change_checkbox1 )->event('click',
$this->Js->request(array(
'controller'=>'testing',
'action'=>'changeto'
), array(
'update'=>'#changeDiv',
'async' => true,
'method' => 'post',
'dataExpression'=>true,
'data'=> $this->Js->serializeForm(array(
'isForm' => false,
'inline' => true
))
))
);
这是生成以下Jquery / javascript
$(document).ready(function () {$("#ck0_1_8").bind("click", function (event) {$.ajax({async:true, data:$("#ck0_1_8").closest("form").serialize(), dataType:"html", success:function (data, textStatus) {$("#changeDiv").html(data);}, type:"post", url:"\/mytest-site\/options\/testing"});
return false;});
}
我的控制器有一个名为
的功能 changeto()
{
$this->layout = 'ajax';
}
我第一次点击这个复选框,这没有任何问题。但是,任何后续点击都不起作用。 javascript甚至没有被调用。
我的问题是:
有什么想法吗? 如果我以某种方式请求cakephp使用on()/ live()insead of bind(),它会有帮助。如果是的话?
谢谢!
答案 0 :(得分:3)
通过编辑cakephp核心文件来解决这个问题:
lib/Cake/View/Helper/JqueryEngineHelper.php
第184行: 变化
return sprintf('%s.bind("%s", %s);', $this->selection, $type, $callback);
到
return sprintf('%s.live("%s", %s);', $this->selection, $type, $callback);
蛋糕版2.2.2
答案 1 :(得分:0)
您必须使用on
代替bind
,因为他们在此问题中提出了.live() vs .bind()
我所做的就是在Helper
上创建我自己的View/Helper
添加以下方法:
public function onEvent($selector, $type, $callback, $options = array()) {
$defaults = array('wrap' => true, 'stop' => true);
$options = array_merge($defaults, $options);
$function = 'function (event) {%s}';
if ($options['wrap'] && $options['stop']) {
$callback .= "\nreturn false;";
}
if ($options['wrap']) {
$callback = sprintf($function, $callback);
}
return sprintf('$(document).on("%s", "%s", %s);', $type, $selector, $callback);
}
从我的观点中使用该方法:
echo $this->MyJs->onEvent('#creditcards', 'change', $eventCode, array('stop' => false));