【问题标题】:jQuery AJAX refresh page content after successjQuery AJAX 成功后刷新页面内容
【发布时间】:2015-06-23 10:44:29
【问题描述】:

我正在使用 jQuery .click() 更新我的数据库,然后调用我的 AJAX;我的问题是,一旦 SQL 运行了刷新页面内容的最佳方式,我就可以再次执行上一个操作,目前我正在使用window.location.reload(true);,但我不喜欢这种方法,因为我不想让页面重新加载我想要的只是我用来更新它的元素上的内容,以便在 AJAX 成功后匹配数据库字段

这是我的 jQuery:

$(document).ready(function(){
    $("span[class*='star']").click(function(){
        var data = $(this).data('object');

        $.ajax({
            type: "POST",
            data: {art_id:data.art_id,art_featured:data.art_featured},
            url: "ajax-feature.php",
            success: function(data){
                if(data == false) {
                    window.location.reload(true);
                } else {
                    window.location.reload(true);
                }  
            }
        });
        console.log(data.art_featured);
    });
});

PHP:

<section class="row">
    <?php
    $sql_categories = "SELECT art_id, art_featured FROM app_articles" 

    if($result = query($sql_categories)){
        $list = array();

        while($data = mysqli_fetch_assoc($result)){
            array_push($list, $data);
        }

        foreach($list as $i => $row){
    ?>
    <div class="row">
        <div class="column one">
            <?php if($row['art_featured']==0){
            ?>
            <span data-object='{"art_id":"<?php echo $row['art_id'];?>", "art_featured":"<?php echo $row['art_featured'];?>"}' class="icon-small star"></span>
            <?php
                } else if($row['art_featured']==1) {
            ?>
            <span data-object='{"art_id":"<?php echo $row['art_id'];?>", "art_featured":"<?php echo $row['art_featured'];?>"}' class="icon-small star-color"></span>
            <?php
                }
            ?>
        </div>
    </div>
    <?php
        }
    } else {
        echo "FAIL";
    }
    ?>
</section>

编辑:

我需要用art_featured 更新.star.star-color 类,具体取决于当时art_featured 的值,基本上我在哪里回显art_featured 我需要那个Ajax 成功后重新加载。

编辑:

$("span[class*='star']").click(function(){
    var data = $(this).data('object');
    var $this = $(this); //add this line right after the above

    $.ajax({
        type: "POST",
        data: {art_id:data.art_id,art_featured:data.art_featured},
        url: "ajax-feature.php",
        success:function(art_featured){
            //remember $this = $(this) from earlier? we leverage it here
            $this.data('object', $.extend($this.data('object')),{
                art_featured: art_featured
            });
        }
    });
    console.log(data.art_featured);
});

【问题讨论】:

  • 需要更新的 HTML 元素是什么?我们能看到吗?您能否概述一下元素的哪些部分特别需要更新,以便我们更好地解决手头的问题?
  • 您可以使用 json 响应并从匹配的 json 响应中替换旧的 DOM html 或值。
  • @Ohgodwhy 谢谢,我刚刚更新了我的帖子。

标签: php jquery ajax


【解决方案1】:

如果你可以在 MySQL 数据库成功后返回 art_featured,它会将它发送回 ajax 成功函数。在这里,我们可以操作数据,但是,首先我们应该存储对被点击元素的引用。

var data = $(this).data('object');
var $this = $(this); //add this line right after the above

现在在我们的成功函数中,不要使用data,而是使用art_featured,因为这就是我们要返回的全部内容。现在我们可以更新目标上的现有数据对象了。

success:function(art_featured){
    //remmeber $this = $(this) from earlier? we leverage it here
    $this.data('object', $.extend($this.data('object'),{
        art_featured: art_featured
    }));
}

以上将扩展现有的数据对象,允许基于我们正在扩展的对象重新定义键:值对。

您应该会发现它按预期工作。

【讨论】:

  • 我明白了这里的想法,但是当我实现它时,我必须重新加载页面,然后才能单击更改我的字段值,例如它返回 1 1 1 1 但如果我重新加载页面,它将当我点击它时切换到 0,我必须再次重新加载页面才能再次切换它
  • @MitchellLayzell 我很难理解。上面的代码中没有任何内容需要重新加载页面。如果您要发回刚刚插入数据库的数据以供我们使用,那么它将是基于上面给出的代码的最新数据。如果您刷新页面,您应该从我们刚刚更新的同一个数据库中生成数据,那么它有什么不同呢? 困惑
  • 对不起,我试着解释一下,当我点击我的 span 元素时,我运行一个更新语句,将我的字段从 1 更改为 0,反之亦然,一旦语句完成,我希望能够点击该 span 元素再次将值从 0 更改为 1,问题是一旦查询运行并完成,我用于发送数据的值在重新加载页面之前不会更新,因此它会一直发送相同的值,直到页面有已重新加载并从数据库中加载新值
  • @MitchellLayzell 嗯嗯,这个0/1 视觉上在哪里?它必须存在于某个地方,并且您的代码不会在任何地方出现 0/1,只是一个 data-object 存储有关 art_featured / art_id 的信息。两者都不会在页面上打印任何内容。跨度里面有文字吗?它是否从数据对象中绘制了您未向我们展示的文本?
  • 0 / 1 仅位于数据对象中,这是我用来发送 mySQL 字段 art_featuredart_id 用于更新数据库的,我猜这些是sql成功后需要更新什么,但我不确定如何真正选择那些在成功时更改其内容
【解决方案2】:

我不完全理解您的问题,所以我们假设您要更改的内容是一个具有类 div 的 div,并且您想用刚刚发送的内容(即数据)替换内容。然后你需要返回数据(可能使用 JSON 是最简单的),然后你的调用将是

  $.ajax({
        type: "POST",
        data: {art_id:data.art_id,art_featured:data.art_featured},
        url: "ajax-feature.php",
        dataType:'json',
        success: function(data){
          for(n in data){
            $('.div').append('<p>'+data[n]+'</p>');
            }
        }
});

注意添加 dataType 返回为 json,然后通过 for n in data 遍历 json 数据,然后使用 n 从数组中调用数据。因此,如果第三项是名称,那么您可以执行类似的操作

 $('.div').append('<p>Name is '+data[3]+'</p>');

您必须通过 json 编码从 PHP 表单返回数据,这可以使用 json_encode php 函数完成。如果是跨域,则必须使用 jsonp

编辑: 如果您在发送表单之前已经知道要替换的数据(即不需要响应),那么您可以将这些变量放入成功回调中。这将等待 ajax 成功返回,然后更新您的 div。

所以你可以拥有这个

var updateText = yourDataFromForm

$.ajax({
        type: "POST",
        data: {art_id:data.art_id,art_featured:data.art_featured},
        url: "ajax-feature.php",
        dataType:'json',
        success: function(data){

            $('.div').append('<p>'+updateText+'</p>');

        }
});

【讨论】:

  • 谢谢,但是这将如何与 HTML 中的数据对象一起工作,因为我正在使用它,所以我可以使用该数据来处理 Ajax 并将该数据发送到 mySQL 语句,所以我该如何选择我的 html 数据对象中有一些东西,谢谢!
  • 在您的 ajax 调用之前会发生什么?这是否附加到 jQuery 单击或提交事件处理程序?你能张贴你的表格的标记。如果能提供一些进一步的信息,我可能会提供更好的帮助。
  • 除了我之前的评论,你也不需要像这样使用 data 参数,如果它在一个表单中你可以获取整个表单数据并使用 jQuery .serialize - api.jquery.com/serialize
  • 我正在使用 click,然后我在 span 元素上使用 data-obect 来获取我的数据库字段值,然后当我单击 span 时,我通过带有数据的 ajax 发送该数据:然后运行一条sql语句
猜你喜欢
  • 2016-10-09
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2013-08-10
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多