【问题标题】:How to update an Ajax call depending on button clicked?如何根据单击的按钮更新 Ajax 调用?
【发布时间】:2020-01-27 22:10:57
【问题描述】:

我有以下 HTML 代码,其中包含了 Bootstrap Tabs/Pills。我的目标是让用户看到前一天和过去 7 天的数据计数,具体取决于他们选择的选项卡。我有一个有效的 AJAX 调用,它从过去 24 小时和过去 ​​7 天中提取一个计数。

但是,每当我点击“周”标签时;数据仍然显示白天的数据。有人可以建议我哪里出错了吗?

谢谢

HTML:

<div class="col-md-4 border rounded">     
  <h4><u>Count </u></h4>
  <ul class="nav nav-pills">
    <li class="active"><a data-toggle="pill" onclick="$('#time_runs').text('day-time')" href="#today_num">Day</a></li>
    <li><a data-toggle="pill" onclick="$('#time_runs').text('week-time')" href="#week_num">Week</a></li>
  </ul>
</div>

AJAX 调用:

$(document).ready(function getMetadata() {
    $(function poll() {
      $.ajax({
        url: "<!--#include virtual="../include/env"-->/count/" +  ($('#time_runs').text() == '' ? 'day-time' : $('#time_runs').text()),
        type: "GET",
        cache: "false",
        success: function(data) {
          count(data);
        },
        dataType: "json"
      });
    })
  })
  ;

【问题讨论】:

  • 你是如何调用 poll() 函数的?为什么它被包裹在$(??。看起来您可能会在页面加载时调用此函数一次,之后再也不调用它。您需要确保在用户选择选项卡时调用该函数。
  • 您好 ADyson,1. poll() 函数添加错误。我已将它从我的代码 2 中删除。我的印象是 $() 是调用 id 的正确语法? 3. 这也是我的假设。它与 $(document).ready 有关吗?你会建议代码的外观如何?
  • "$() 是调用 id 的正确语法吗?" ...该语法调用 jQuery 构造函数,该构造函数通常用于选择元素...但是您正在使用它来包装函数定义,在这种情况下,它没有多大意义。
  • $(document).ready 用于包装一个代码块,您希望延迟其执行直到页面完全加载(例如,在元素上设置事件处理程序,同时确保这些元素在处理程序被声明)。在继续之前,您可能需要复习一下 jQuery 和 JavaScript 基础知识
  • 如果您准备好耐心等待,那么当我下次走到电脑前时,我会为您拼凑一个代码示例。我现在在手机上,所以很难输入,几乎不可能测试

标签: javascript html ajax twitter-bootstrap tabs


【解决方案1】:

以下是完全使用 Bootstrap 的内置选项卡功能的方法。请参阅Bootstrap docs 了解更多信息。

注意我在这里使用了一个虚拟 URL,它总是返回相同的数据,但这只是一个细节 - 这里的重点是

a) 根据文档正确设置标签

b) 响应“显示标签”事件,以便您可以触发新请求以获取计数

c) 存储您发送到服务器的值,以告诉它在选项卡的数据属性中返回什么数据,而不是搞乱设置然后读取另一个单独字段的值。

注意设计说明:您可能需要考虑缓存数据和/或将这些计数预加载到页面中,而不是每次显示选项卡时都发出 AJAX 请求。由于您似乎有固定数量的选项卡并且计数数据很小,因此每次用户单击选项卡时继续触发 HTTP 请求以获取这一点数据似乎效率低下。除非每隔几秒在服务器上更改此数据,否则不太可能产生不同的结果。

$(document).ready(function() {
  $('a[data-toggle="tab"]').on('shown.bs.tab', function() {
    var time = $(this).data("time");
    console.log(time);
    $.ajax({
      url: "https://api.myjson.com/bins/zzirx?time=" + time,
      type: "GET",
      cache: "false",
      success: function(data) {
        console.log(data);
      },
      dataType: "json"
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />

<div class="row">
  <div class="col-md-4 border rounded">
    <h4><u>Count </u></h4>

    <ul class="nav nav-pills" id="myTab" role="tablist">
      <li class="nav-item">
        <a class="nav-link active" id="day-tab" data-toggle="tab" data-time="day-time" href="#day" role="tab" aria-controls="day" aria-selected="true">Day</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" id="profile-week" data-toggle="tab" data-time="week-time" href="#week" role="tab" aria-controls="week" aria-selected="false">Week</a>
      </li>
    </ul>
    <div class="tab-content" id="myTabContent">
      <div class="tab-pane fade show active" id="day" role="tabpanel" aria-labelledby="home-tab">Day</div>
      <div class="tab-pane fade" id="week" role="tabpanel" aria-labelledby="profile-tab">Week</div>
  </div>
</div>

【讨论】:

  • 谢谢 ADyson,谢谢。但是,当页面准备好时,默认情况下我的 Day Tab 不会加载。我必须选择“日”选项卡才能显示。我看到您的示例中没有发生这种情况。在您的代码中,当文档准备好时加载 Day? (以防我错过了什么)
  • &lt;div class="tab-pane fade show active" id="day" ...注意那里的“show”和“active”类。在链接上类似 - &lt;a class="nav-link active"。检查您是否在您的版本中正确设置了该设置
  • 嗯。它们的配置与您上面的一样。但仍然需要点击它才能真正显示数据。
  • 也许你有一些其他的 CSS 隐藏它或什么?我真的不能不看它,它一定是不明显的东西。如果您可以创建重现问题的代码的 CodePen 或 JSFiddle 演示,那么也许我可以帮助您解决问题。
【解决方案2】:

您好,这是一个使用您的代码的示例,这里有几个更改是fiddle

  1. 在您的ul 中添加一个ID,在本例中我们将使用#nav-pills
  2. 将名为 selected 的数据属性添加到您的 ul 元素中。
  3. 在您每次点击时,我都会将此onclick="$('#time_runs').text('week-time')" 更改为此onclick="return $('#nav-pills').data('selected','today')"
  4. 由于我们现在不执行您的投票功能,因此我在您的 ul 上添加了一个委托事件,例如 $('#nav-pills').on('click','li&gt;a'

$(document).ready(()=>{
$('#nav-pills').on('click','li>a',(e)=>{
//your ajax call here instead of this example one
let time = $('#nav-pills').data("selected");
console.log(time);
json = {
today:"todays log yay!!!",
weak:"a Weak ago log,lets rock"
};
$.ajax({
    url: '/echo/json/',
    type: 'POST',
    dataType: 'JSON',
    data: {time: time, json:JSON.stringify(json)}
  }).done((response)=>{
  console.log(time,response)
  })
})
})
 

   <script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<div class="col-md-4 border rounded">     
  <h4><u>Count </u></h4>
  <ul id="nav-pills" class="nav nav-pills" data-selected="">
    <li class="active"><a data-toggle="pill" onclick="return $('#nav-pills').data('selected','today')" href="#today_num">Day</a></li>
    <li><a data-toggle="pill" onclick="return $('#nav-pills').data('selected','weak')" href="#week_num">Week</a></li>
  </ul>
</div>

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多