【问题标题】:AJAX: append data with fadeInAJAX:使用淡入淡出附加数据
【发布时间】:2016-09-01 00:07:57
【问题描述】:

我针对一个不同的问题提出了一个问题,最终导致了我现在需要帮助的问题。 AJAX form Submit to post comments

我得到了解决 js 错误的方法,但现在问题出在其他问题上。

我正在使用我在此处找到的脚本。 Credits and Demo to original script

它的目的是发布 cmets 而不用淡入效果刷新页面。我修改了它以适合我的项目,我现在遇到的问题是,即使它正在将数据保存到数据库中,它也没有实时加载 cmets。我必须手动刷新页面才能看到新内容。由于它没有在开发者控制台中抛出任何 js 错误,所以我找不到问题所在。

评论区

<div class="comments">
    <div class="top-title">
        <h3>Messages</h3>
    </div>
    <ul class="level-1">
    <div class="comment-block">
<?php while ($row = mysqli_fetch_array($res_post_select))
{
$PageID = $row['PageID'];
$Name = $row['Name'];
$Photo = $row['Photo'];
$PostDate = $row ['PostDate'];
$Comment = nl2br($row['Comment']);
?>
    Posted on <?php echo DATE("F d, Y", strtotime($PostDate)) ?> at <?php echo DATE("g:i a", strtotime($PostDate)) ?>
    <li>
    <span class='comment'>
    <span class='picture'>
    <span><img src='users/images/<?php echo $Photo?>'></span>
    </span>
    <span class='content'><span class='mid-title'><b><?php echo $Name ?></b>, Said:</span><br><?php echo $Comment ?></span>
    <span class='clear'></span>
    </span>
    </li>
<?php } ?>

JS Credits

<script>
$(document).ready(function(){
  var form = $('form');
  var submit = $('#submit');

  form.on('submit', function(e) {
   //$('#submit').on('click', function(e) {
    // prevent default action
    e.preventDefault();
    // send ajax request
    $.ajax({
      url: 'data/queries/comment-insert.php',
      type: 'POST',
      cache: false,
      data: form.serialize(), //form serialized data
      beforeSend: function(){
        // change submit button value text and disabled it
        submit.val('Posting...').attr('disabled', 'disabled');
      },
      success: function(data){
        // Append with fadeIn see https://stackoverflow.com/a/978731
        var item = $(data).hide().fadeIn(800);
        $('.comment-block').append(item);

        // reset form and button
        form.trigger('reset');
        submit.val('Post Message').removeAttr('disabled');
      },
      error: function(e){
        alert(e);
      }
    });
  });
});
</script>

comment-insert.php 文件

<?php
if (isset( $_SERVER['HTTP_X_REQUESTED_WITH'] )):
$ds = DIRECTORY_SEPARATOR;
$base_dir = realpath(dirname(__FILE__)  . $ds . '..') . $ds;
include_once("{$base_dir}..{$ds}include{$ds}dbconfig.php");
include_once("{$base_dir}..{$ds}include{$ds}dbconnection.php");
$conn = dbconnect();

    if(!empty($_POST['comment']))
        {
$Name = mysqli_real_escape_string($conn, $_POST['Name']);
$PageID = mysqli_real_escape_string($conn, $_POST['PageID']);
$ID = mysqli_real_escape_string($conn, $_POST['ID']);
$Comment = mysqli_real_escape_string($conn, $_POST['comment']);

$sql = "INSERT INTO comments
(PageID, ID, Name, PostDate, Comment)
VALUES
('$PageID', '$ID', '$Name', now(), '$Comment')";

    mysqli_query($conn, $sql) or die("Error: ".mysqli_error($conn));

}
?>

<!-- This is the mark up that should fadeIn after the data is inserted into the database.
 You can refer to the demo found in the credited page -->

<li><span class='comment'>
<span class='picture'>
<span><img src='users/images/<?php echo $Photo ?>'></span>
</span>
<span class='content'><span class='title'><b><?php echo $Name ?></b>, Said:</span><br><?php echo $Comment ?></span>
<span class='clear'></span>
</span>
</li>

<?php
mysqli_close($conn);
endif

因此,ajax 会触发在 comment-insert.php 中找到的查询,但它不会实时插入,也不会在控制台中给出任何 js 错误。我必须手动刷新页面才能查看 cmets,这违背了实时评论想法的目的。

【问题讨论】:

  • 您能否预览 AJAX 查询在您的浏览器控制台网络选项卡中返回的内容?
  • 您是否检查过您至少进入了success 回调并在data 中获取了您的HTML?
  • 旁注:无需大写 PHP 变量。 DATE() 应该是 date()
  • @TomDillinger。它预览文本部分。图像不预览。 POST 响应返回这个。
  • John Doe,说:
    这是你选择的选项
  • span> 并且 HTML 返回没有格式的文本部分(无图像)。
  • 我会使用元素检查器来检查 cmets 是否被附加,但没有显示。
  • 标签: php html ajax


    【解决方案1】:

    使用别人的代码总是很有挑战性的。

    首先,不需要&lt;form&gt;&lt;/form&gt; 构造。只需使用 DIV。这将消除使用e.preventDefault() 的需要(仅用于抑制默认的&lt;form&gt; 导航离开当前页面的行为)。

    接下来,如果用户点击的元素在最初渲染后(DOM)被添加到 DOM 中,则只需要使用.on().on() 的目的是指示 DOM 将 javascript 代码绑定到稍后将出现的元素,但在 javascript 代码执行时该元素尚未在 DOM 中。 在这种情况下,如果没有.on(),用户单击将不会执行任何操作,因为代码无法绑定到尚不存在的按钮。

    请查看this post 中的简单 AJAX 示例。老实说,您可以轻松地自己构建这个聊天系统,而无需使用 w3bee 的代码。但是,在您构建了一些可行的东西之后,您可能希望将您想出的内容与 w3bee 代码进行比较,看看他们是否有任何好的想法。但说真的,自己构建它。您将花费数天时间对 w3bee 的代码进行故障排除(主要是因为它仍然是一个黑盒子),但您可以在几个小时内自己重现它。

    the linked post 中的示例,将它们复制到您的服务器,并使其工作。特别是this one。您将在 20 分钟内玩这些示例,而不是在两天内修改 w3bee 的代码。

    至少,让这些示例在您自己的系统上运行可能会帮助您了解您现在拥有的 w3bee 代码存在什么问题。


    说了这么多,目前代码的问题大概出在javascript AJAX success:函数上。尝试显示收到的内容(从 PHP 端),看看你得到了什么:

    $.ajax({
      url: 'data/queries/comment-insert.php',
      type: 'POST',
      data: form.serialize(), //form serialized data
      success: function(data){
        alert(data);
      }
    });
    

    【讨论】:

    • 首先,感谢您的宝贵建议。我现在要研究它们,看看我能从中学到什么并想出什么。作为对您发布的代码示例的响应,alert(data) 返回 html 代码
    • John Doe,说:
      这是您选择的选项
    • ,所以是传递成功。同时,我将检查您提供的那些链接。谢谢阿甘。
  • 对,有几点意见。首先, $Photo 变量在 PHP 端看起来是空白的。接下来,您可以通过在 AJAX success: function(){$('#someDivNameThatExists').html(data);}); 中执行类似 * 的操作来获取 PHP 返回的任何内容并使其出现在 DOM 中
  • 这花了一些时间,但除了两件事情,也许你仍然可以帮助我。 1) 消息发布并淡入,但它们出现在所有消息的底部,而不是作为第一条/最新消息出现在顶部,但是当页面刷新时,它会出现在顶部的适当位置。 2) 有时消息在页面刷新之前出现重复,这种情况并非一直发生,可能每 2 到 3 条消息发生一次。
  • (1) 代替$('.comment-block').append(item);,使用$('.comment-block').prepend(item); (2) 间歇性问题是个麻烦。嗯。什么都没有想到。看看#1 是否解决了它,如果没有,请关闭此问题(通过选择最佳答案) 并发布一个新问题。 (这样你就有几十个人在阅读/帮助,而不是等我去拜访 SO)
  • 谢谢。 prepend 工作,现在 cmets 根据需要出现在顶部。我将尝试解决第二个问题。感谢所有的帮助。
  • 【解决方案2】:

    您的 PHP 文件似乎没有向 javascript AJAX 例程发送(回显)任何内容。

    试试这个。像这样更改您的 comment-insert.php 文件:

    <?php
        $ds = DIRECTORY_SEPARATOR;
        $base_dir = realpath(dirname(__FILE__)  . $ds . '..') . $ds;
        include_once("{$base_dir}..{$ds}include{$ds}dbconfig.php");
        include_once("{$base_dir}..{$ds}include{$ds}dbconnection.php");
        $conn = dbconnect();
    
            if(!empty($_POST['comment']))
                {
        $Name = mysqli_real_escape_string($conn, $_POST['Name']);
        $PageID = mysqli_real_escape_string($conn, $_POST['PageID']);
        $ID = mysqli_real_escape_string($conn, $_POST['ID']);
        $Comment = mysqli_real_escape_string($conn, $_POST['comment']);
    
        $sql = "INSERT INTO comments
        (PageID, ID, Name, PostDate, Comment)
        VALUES
        ('$PageID', '$ID', '$Name', now(), '$Comment')";
    
            mysqli_query($conn, $sql) or die("Error: ".mysqli_error($conn));
    
        }
        $Photo = 'your_image.jpg';
        $out = "
            <li><span class='comment'>
            <span class='picture'>
            <span><img src='users/images/" .$Photo. "'></span>
            </span>
            <span class='content'><span class='title'><b>" .$Name. "</b>, Said:</span><br>" .$Comment. "</span>
            <span class='clear'></span>
            </span>
            </li>
        ";
        echo $out;
    ?>
    

    请注意,上面的代码没有 $Photo 变量并且会失败,所以我提供了一个变量,这样代码就不会崩溃。请酌情修正。

    【讨论】:

    • 感谢您的回复。我尝试了您的方法,但仍然得到相同的结果。 html 结果在页面刷新之前不会附加。你能看看原始脚本,看看你是否能发现它为什么不适合我吗? w3bees.com/2013/09/…
    • 我没有将此答案变成可出版的电子书,而是在单独的答案中添加了额外的帮助。 一如既往,如果以上任何答案对您有帮助,请点赞。
    【解决方案3】:

    我实际上在这里猜测它为什么可能不起作用。这可能是您尝试做事的顺序。您正在淡化 HTML 响应,然后它实际上是在 DOM 中。您需要在 DOM 中拥有它,然后才能真正淡化它。所以不要这样做

    var item = $(data).hide().fadeIn(800); // fading while it is not in the DOM
    $('.comment-block').append(item);
    

    var item = $(data).hide();
    $('.comment-block').append(item); // in the DOM
    item.fadeIn(800); 
    

    【讨论】:

    • 感谢 Mikey,但该更改没有任何效果。我仍然得到相同的结果。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签