0

我有一个页面,我需要在其中向某些元素添加拖放功能。当 drop 事件发生时,它对 php 函数进行 ajax 调用,然后刷新 div 的内容。我使用 jQuery 和 jQueryUI 进行拖放,并使用 CakePHP 作为 PHP 框架(不确定这是否相关)。

在 Firefox、Safari 甚至 IE 中一切正常,但在 Opera 或 Chrome 中,div 的内容没有刷新(尽管 PHP 函数的操作已执行)。

所以,这里是代码:

jQuery('#lists div').
    filter(function() {return this.id.match(/item[\d]+_[\d]+/);}).
    each(function() { jQuery(this).draggable( {axis: 'y'}); });

jQuery('#lists div').
    filter(function() {
        return this.id.match(/list[\d]+/);}).
               each(function() { 
                   jQuery(this).droppable({
                      drop: function(event, ui) {
                            dropID = jQuery(event.target).attr('id');
                            dragID = jQuery(ui.draggable).attr('id');

                            itemID = dragID.substr(dragID.lastIndexOf('_') + 1);
                            oldListID = dragID.substr(4).replace(/_[\d]+/g, '');
                            newListID = drop.substr(4);

                            jQuery.ajax({
                                url:  "/lists/itemToList/"+itemID+"/"+oldListID+
                                      "/"+newListID,
                                type: "POST",
                                success: function (data) {
                                     jQuery('#lists').html(data);}
                            });
                         }
                 });
    });

基本上,没有执行成功函数,但是如果我尝试查看 errorThrown (在错误事件上)它是“未定义的”

4

4 回答 4

1

尝试这样的事情:

jQuery.ajax({
   url:  "/lists/itemToList/"+itemID+"/"+oldListID+
      "/"+newListID,
   type: "POST",
   success: function (data) {
      jQuery('#lists').html(data);
   }
   error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert(XMLHttpRequest.status);
      alert(XMLHttpRequest.responseText);
   }
});

它会告诉你你的请求得到了什么http响应。前段时间我遇到了同样的问题。我的脚本在 Firefox 和 Chrome 中运行良好,但在 Opera 和 IE 中没有任何作用。我检查了它,问题是,php后端返回404(我仍然不知道它在Chrome和FF下是如何工作的)。

于 2009-11-26T20:39:46.520 回答
1

我知道我已经很长时间没有发布这个问题了,但这是我发现的解决方案,以防其他人需要它:问题不是在 javascript 中,而是在 CakePHP 中:添加的 html success 包含一个 ajax 表单(使用 $ajax->form() 呈现)。$ajax->form() 需要来自控制器的 $data 变量是一个数组,但由于某种原因它不是,这破坏了表单的呈现,Opera 和 Chrome 不喜欢这样。所以解决方案是简单地添加

$this->data = array();

到我的控制器中的 itemToList() 函数。

于 2011-01-25T16:04:44.907 回答
0

我在代码中看不到任何会导致跨浏览器问题的内容。innerHTML我的感觉是,问题根本不在于代码,而在于 div 的呈现和/或其在 Chrome 和 Opera 中的内容(即 CSS 问题或类似div 更新的那些行) ,但由于样式或定位的原因,您无法获得所需的视觉效果)。

您是否使用过 Dragonfly 或其他一些开发人员工具来验证目标元素的内容在成功请求后实际上没有改变?沿着这些思路,您是否尝试过在有问题的浏览器中逐步执行代码?您也可以尝试error在选项中添加处理程序,JQuery.ajax以查看请求本身是否存在问题,尽管我不认为这就是问题所在。

编辑:我没有看到代码块下方的最后一点。所以你已经验证了成功处理程序没有被执行。您说您确实尝试为请求实现错误处理程序并得到一些未定义的结果,但我在代码中没有看到它。您能否发布错误处理程序的代码并描述错误中未定义的内容?

于 2009-11-06T19:20:38.473 回答
0

我认为他的意思是, alert(errorThrown) 显示“未定义”。

于 2009-11-26T20:36:32.203 回答