【问题标题】:View response data from AJAX request for multiple elements查看来自多个元素的 AJAX 请求的响应数据
【发布时间】:2020-06-28 23:00:49
【问题描述】:

我的网站中有一个 like 系统。每条消息都有一个赞按钮和旁边的计数器。
现在,当有人点击 Like 按钮时,它应该立即变为 1,如果另一个用户点击相同的消息,它会变为 2,以此类推。

我创建了执行此操作所需的 AJAX 函数,但我使用的是 document.getElementById,它只检索找到的第一个实例并查看来自 ajax 请求的响应。

我怎样才能使它可以查看每条消息?

这是我的 AJAX 请求:

jQuery(document).ready(function($){
    $('.msg-icon').on('click', function(e){
    e.preventDefault(); 
 
    var reply_id = $(this).find('input[name="replymsg"]').val();
   var request = reply(reply_id); 
   
    request.done(function() { 
      checkLikes(reply_id);
    });
  });
});
   
  
function reply(reply_id) {
  return $.ajax({ 
    data: reply_id, 
    type: "post", 
    url: "replyfavorite.php?replymsg="+reply_id, 
  });
}

function checkLikes(reply_id) {
  return $.ajax({
    data: { reply: reply_id },
    type: "get",
    url: "checkLikes.php?reply=" + reply_id,
    success: function(data) {
      document.getElementById('likesCount').innerHTML = data; //what can i change here to make the data go to each clicked button?
    }
  });
}

这是用户为每条消息单击的我的 html 按钮:

<a href="" class="msg-icon" >

<i class="fas fa-heart fa-lg" id="favBtn" style="color: #e74f4e !important;"  >
  <span id="likesCount"><?php echo $row3['likes_count'] ?>
</span></i></a>

代码运行良好我唯一的问题是如何让响应仅转到单击的消息按钮。

【问题讨论】:

  • @RokoC.Buljan 这是问题中的一个错字............
  • @RokoC.Buljan 你对我的问题有什么解决办法吗?
  • 我只是确保问题没有缺少结束标签。 (提问时请务必创建一个minimal reproducible example - 不要遗漏详细信息 - 否则您将收到子 cmets 而不是详细答案。)
  • 你有这段代码:$(this).find('input[name="replymsg"]').val()你能解释一下吗?
  • @RokoC.Buljan 我没有遗漏任何内容......我已经说过代码工作正常,并准确解释了我的问题所在。请提供答案,不要将我的问题转移到其他地方

标签: javascript jquery ajax xmlhttprequest


【解决方案1】:

如您所见,ID 应该是唯一的。而不是使用document.getElementById('likesCount').innerHTML = data;
使用data-* attribute

即:

<span data-id="536">12</span>

比jQuery里面的success更喜欢:

success: function(data) {
  $(`[data-id="${reply_id}"]`).text(data)
}

这样会用最新的点赞数更新页面上任意数量的data-id=""元素。

PS:如果你想让你的计数 “活” - 您可以使用https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API

,而不是使用仅往返一次的 AJAX(请求 → 响应)

通过使用 Web Sockets,您可以确保在任何客户端和您的服务器之间进行初始握手,而不是在两者之间共享小数据包 - 同时用于多个客户端。这样一来,您就不需要重复 AJAX 间隔 - 您的所有客人都会看到喜欢的更改值“自动”

【讨论】:

  • 谢谢你,惊人的答案。这将对我项目的未来领域有所帮助
【解决方案2】:

既然你使用jquery,为什么不使用$("#likesCount").each(function(){ . . . . .. });循环遍历每个项目,在每个部分中,您执行 ajax 请求以查找当前值,可能使用 $.post() 或 $.get(),具体取决于您的 api。

更新:(改进我的答案) 我了解文档中元素 id 的唯一性。

我真正想说的是,您可能想要更改如何查看/搜索要包含在每个跨度内的详细信息的方法。在那里,您可以通过使用 Class 或自定义属性对 span 对象进行分组来识别它们,然后使用 $.each 函数对其进行迭代。没有单一的方法可以完成事情,这只是关于如何使用正确的内容更新每个元素的想法。

【讨论】:

  • 这绝对不能回答我的问题。
  • 您建议发送至:why not use $("#likesCount").each(。 Julio,#likesCount 是 ID 选择器,没有必要 each,因为在一个页面内只能有 一个 单个 ID 元素。此外,由于在 jQuery 中,选择器包含在 jQuery 对象中 - jQuery 提供了许多内部(在库中)已经使用 .each 操作的方法,例如,假设您有许多 .foo 元素:$(".foo").text("BAR") 将更改文本所有这些元素 - 不需要每个单独的元素(就像我们需要在纯 JS 中做的那样)
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多