【问题标题】:jQuery sortable with AJAX only works every other time使用 AJAX 进行排序的 jQuery 只能每隔一段时间使用一次
【发布时间】:2013-02-04 17:21:14
【问题描述】:

我有一个字段表,其中包含使用 jQuery 的可排序插件的拖动排序句柄,一旦单击提交按钮,该插件又通过 AJAX 触发 PHP 脚本以保存更改。但是,它实际上仅平均每隔一次有效。每隔一段时间我就会连续两次成功运行,但这种情况非常罕见。

这是我的动态生成的 HTML:

<div class="foldertable">
  <table class="data" id="sortable">
    <tr class="odd" id="field_21">
      <td class="handle"><a href="/admin/database/customfields/edit?cfid=21">Occupant Name</a></td>
    </tr>
    <tr class="even" id="field_22">
      <td class="handle"><a href="/admin/database/customfields/edit?cfid=22">DBA</a></td>
    </tr>
    <tr class="odd" id="field_23">
      <td class="handle"><a href="/admin/database/customfields/edit?cfid=23">Tenant Contact</a></td>
    </tr>
  </table>
  <a href="" id="button" class="textbutton">Update Order</a>
</div>

还有我的 jQuery:

    <script type="text/javascript">
    var fixHelper = function(e, ui) {
        ui.children().each(function() {
            $(this).width($(this).width());
        });
        return ui;
    };
    $(document).ready(function(){
        $("#sortable tbody").sortable({ 
            helper: fixHelper,
            opacity: 0.6, 
            update: function(){
                $('#savemessage').html('<p>Click <em>update order</em> to save</p>');
                $('#button').show();
                }
        });
        $('#button').click(function(event){
            var order = $("#sortable tbody").sortable("serialize");
            order += "&crudtype=order";
            $('#savemessage').html('<p>Saving changes...</p>');
            $.post("/admin/database/customfields/crud",order,function(theResponse){
                    $('#savemessage').html(theResponse);
                });
        });
    });
    </script>

以及生成的 PHP 页面 /admin/database/customfields/crud

$fields = $_POST['field'];
$counter = 1;
foreach ($fields as $field) {
  $params = array(array('value' => $counter, 'type' => 'i'), array('value' => $field, 'type' => 'i'));
  db_query('UPDATE customfields SET sortorder = ? WHERE cfid = ?', $params, false);
  $counter++;
}
print '<p>Changes saved</p>';
exit(); // Exit necessary for AJAX call
break; // End reorder

我基于此站点 http://www.simonbattersby.com/blog/drag-and-drop-with-jquery-ui/,它确实有效 - 只是不是每次都有效。谁能告诉我我做错了什么?提前致谢!

【问题讨论】:

    标签: php jquery mysql ajax jquery-ui-sortable


    【解决方案1】:

    我获取了您的代码并重新创建了您的模块,并且每次都能正常工作。 基于此,我唯一可以得出的结论是 PHP 页面可能是从缓存中提供的?你能检查一下“生成的 PHP 页面”的标题吗? 最简单的方法是使用 Firefox 的 Firebug 或 Chrome 的开发者工具来监控网络流量并检查 ajax 调用和 PHP 响应。

    编辑: 我意识到您的问题是 UPDATE ORDER 文本是一个 HREF 链接,因此当用户单击它时会指示浏览器重新加载页面 - 所以有时它会在触发 AJAX 调用之前重新加载它。只需将您的 A HREF 更改为 DIV 或 SPAN 即可。

    所以不是

    <a href="" id="button" class="textbutton">Update Order</a>
    

    <div id="button" class="textbutton">Update Order</div>
    

    <span id="button" class="textbutton">Update Order</span>
    

    【讨论】:

    • 我很乐意提供这一点,尽管我不确定如何通过 Firebug 做到这一点。如何获取 AJAX 调用页面的标题?或者,如果有某种方法可以强制使用非缓存版本,我可以这样做,但我不知道那会是什么命令。
    • 首先在 Firefox 中安装 Firebug。然后打开您的页面,然后启用 Firebug。然后通过重新排序项目在页面上进行更改并单击更新。在 Firebug 的网络部分,您将看到请求发出。您还需要稍微修改您的代码,因为更新订单链接是一个“a href”,所以当您单击它时会重新加载页面。哈普斯。我想我刚刚意识到这可能是导致您的问题的原因。 A HREF 在 AJAX 触发之前重新加载页面。因此,只需将 A HREF 更改为 DIV 或 SPAN,它将 100% 的工作。
    • 做到了——非常感谢,感谢有关网络部分的提示。我一直在使用 Firebug,但从未检查过该选项卡。
    • 没问题,乐于助人。对于 AJAX 开发来说,从浏览器查看网络通信是必须的 - 否则你会迷路。老实说,我最近更多地使用 Chrome 的开发者工具,它具有相同的网络选项。 Firefox 的 Firebug 有更多的功能,但最近我主要是基于 Chrome 开发的,所以使用那里的工具更容易。
    • 您可以在单击事件上返回 false,而不是将按钮更改为 div 或 span。这在语义上是正确的,并且默认情况下 也有一个cursor: pointer
    猜你喜欢
    • 2019-01-19
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2015-07-27
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多