【问题标题】:Cakephp Js helperCakephp Js 助手
【发布时间】:2012-06-27 12:31:23
【问题描述】:

我正在使用 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 在 bind() 中使用 on() / live() 会有所帮助吗?如果是的话如何?

谢谢!!

【问题讨论】:

  • 成功了!!通过直接在 javascript 中将 bind() 替换为 live() 。有什么办法可以告诉 cakephp 使用 live() 而不是 bind() ??

标签: php cakephp


【解决方案1】:

通过编辑 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

【讨论】:

    【解决方案2】:

    您必须使用on 而不是bind,正如他们在这个问题.live() vs .bind() 中建议的那样

    这就是我所做的就是在View/Helper 上创建我自己的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));
    

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多