【问题标题】:Ajax keeps returning the calling pageAjax 不断返回调用页面
【发布时间】:2012-11-08 22:44:26
【问题描述】:

我有这个 ajax 请求,每当我更改输入字段时都会调用它:

$(document).ready(function(){
    $('#PostTitle').change(function(){
        var inputstring=$("#PostTitle").val();
        submitData(inputstring);
    });
});

function submitData(inputstring){
$.ajax({
        type: 'POST',
        url: '/myWebsite/posts/set_post_images',
        data: inputstring,
        dataType: "text",
        success:function(data){
            $("#selectImage").replaceWith($('#selectImage', $(data)));
        },
        error:function(){
            $('#selectImage').html("You failed misserably.");
        },
        timeout: 5000
    });
}

以上代码在 add.ctp 文件(Posts 控制器的视图)中。调用的函数 set_post_images 位于 Posts Controller 本身中,如下所示:

public function set_post_images($url = null) {
    if($url!=null){
        $this->set('imageArray', $this->getImages($url));
    } else {
        $this->set('imageArray', array("/img/someImage.png"));
    }
    if ($this->RequestHandler->isAjax()) {
         $this->autoRender = false;
         $this->layout = 'ajax';
         $this->render('/elements/selectImageElement');
    }
    return;
}

我要做的是从 selectImage div 中获取现有元素,替换为新元素。问题是,ajax 不断返回 add.ctp 文件(调用请求的文件)的全部内容。

这可能是什么原因,我该如何解决?

编辑已解决

$this->Auth->allow(array('set_post_images'));没有设置,所以响应返回整个页面。修复后,可以对操作进行对话。

另外,在控制器中,变量不是通过 $url 而是通过 $this->data['url'] 访问的。

编码愉快!

【问题讨论】:

  • 使用浏览器的开发者工具查看请求的样子。请求正文在这里似乎无关紧要,但 URL 可能很重要。我知道您已经在代码中设置了 URL,但最好查看浏览器实际请求的位置。从那里开始,逐步执行您的操作逻辑。 isAjax() 是真的吗?如果不使用 RequestHandler,Recent Cake 就会有类似 $this->request->is('ajax') 的语句。最后,在浏览器中检查服务器响应。服务器返回整个add.ctp 视图,还是您的replaceWith 代码出错?
  • 你好,本。请求对我来说看起来不错:Request URL:http://localhost/CheckMates/posts/set_post_images Request Method:POST Status Code:200 OK 请求标头包含这个,看起来也不错:Host:localhost Origin:http://localhost Referer:http://localhost/CheckMates/posts/add 我不确定如何验证控制器操作本身,因为调试根本没有显示任何东西(可能是正常的在这种情况下?)。响应是整个 add.ctp,浏览器开发工具显示它,如果我用 alert(data) 输出数据,它会显示整个代码...
  • 哦,另外,在检查请求之前,我用您的代码替换了 RequestHandler。
  • 删除 AJAX 检查。当您使用浏览器查看它时,让该操作正常工作。使用alert() 进行调试或检查响应体并不有趣。一切就绪后,使用 AJAX 将其重新连接到前端。
  • 好吧,我现在觉得有点傻......我的代码中有两件事是关闭的。最重要的是 $this->Auth->allow 不包含 set_post_images 操作,因此根本无法访问它。当我尝试手动访问该操作时,我在您发表评论后注意到了这一点。第二个是我什至没有使用请求传递的参数。现在,我在控制器操作中将 $url 替换为 $this->data['url'] ,一切正常。非常感谢!

标签: php ajax cakephp


【解决方案1】:

$this->Auth->allow(array('set_post_images'));没有设置,所以响应是返回整个页面。修复后,可以对操作进行对话。

另外,在控制器中,变量不是通过 $url 而是通过 $this->data['url'] 访问的。

编码愉快!

【讨论】:

    【解决方案2】:

    请尝试以下代码,

    public function set_post_images($url = null) {
        if($url!=null){
            $this->set('imageArray', $this->getImages($url));
        } else {
            $this->set('imageArray', array("/img/someImage.png"));
        }
        if ($this->RequestHandler->isAjax()) {
             $this->autoRender = false;
             $this->layout = 'ajax';
             $this->render('/elements/selectImageElement');
        }
        exit;
    }
    

    【讨论】:

      【解决方案3】:

      请将 set_post_images 的返回值插入到 id 为“returned-images”的 div 中,然后将您的 ajax 代码更改为此

      function submitData(inputstring){
      $.ajax({
          type: 'POST',
          url: '/myWebsite/posts/set_post_images',
          data: inputstring,
          dataType: "text",
          success:function(data){
              var images = data.find('#returned-images');
              var getResults=images.html();
              $("#selectImage").html(getResults);
          },
          error:function(){
              $('#selectImage').html("You failed misserably.");
          },
          timeout: 5000
      });
      

      }

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 2020-02-09
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        • 2022-03-07
        相关资源
        最近更新 更多