【问题标题】:Execute AJAX call after AJAX LoadAJAX 加载后执行 AJAX 调用
【发布时间】:2015-06-11 18:29:14
【问题描述】:

AJAX 本身对我来说很新,虽然我可以在大多数情况下糊弄过去并弄清楚事情,但这个问题已经困扰了我好几天。

我有一个分为 2 列的页面。左侧是表格中显示的作业列表。单击表格行时,通过此脚本在页面右侧通过ajax加载所选作业的详细信息:

$(".jobTable").on("click", "tr", function() {
  var job_id = $("td:first a.ajaxCall", this).attr("rel");
  $("#jobDetails").html("Loading...");

  $.ajax({
    type: "GET",
    url: "jobs/jobdetails.php",
    data: {
      'id': job_id
    },
    success: function(data) {
      $("#jobDetails").html(data);
      $('#validation').html("");
    }
  });
  return false;
});

这本身就可以正常工作。

我想添加一个下拉菜单,允许在打开的工作、已完成的工作、等待开票的工作和所有工作之间进行排序。我通过使用适当的 SELECT 语句简单地制作 4 个单独的页面并使用此功能来完成此操作:

$(document).ready(function() {
  $("#jobSorter").change(function() {
    $("select option:selected").each(function() {

      if ($(this).attr("value") == "open-jobs") {
        $.ajax({
          url: "jobs/open-jobs.php",
          success: function(data) {
            $("#activeJobTable").html(data);
          },
          error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus);
            alert("Error: " + errorThrown);
          }
        });
      }

      if ($(this).attr("value") == "closed-jobs") {
        $.ajax({
          url: "jobs/closed-jobs.php",
          success: function(data) {
            $("#activeJobTable").html(data);
          },
          error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus);
            alert("Error: " + errorThrown);
          }
        });
      }

      if ($(this).attr("value") == "waiting-for-invoice") {
        $.ajax({
          url: "jobs/waiting-for-invoice.php",
          success: function(data) {
            $("#activeJobTable").html(data);
          },
          error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus);
            alert("Error: " + errorThrown);
          }
        });
      }
      if ($(this).attr("value") == "all-jobs") {
        $.ajax({
          url: "jobs/all-jobs.php",
          success: function(data) {
            $("#activeJobTable").html(data);
          },
          error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus);
            alert("Error: " + errorThrown);
          }
        });
      }
    });
  }).change();
});

这本身也可以正常工作,但是一旦我开始通过 ajax 加载表格,它就不再响应此脚本。当我点击表格时,什么都没有发生。通过一些研究,我认为答案取决于我将第一个函数放入选择器脚本中的“完成:”下,但随后发生的只是表格无法加载。

如何在使用选择菜单加载作业列表时保持加载作业详细信息的功能?

编辑:这是发生这一切的页面的 HTML:

<div class="row">
  <div class="col-md-4" id="jobList">

    <form class="form-horizontal">
      <div class="form-group">
        <label class="col-sm-2 control-label" for="jobSorter">View Only:</label>

        <div class="col-sm-10">
          <select class="form-control" name="jobSorter" id="jobSorter">
            <option value="open-jobs">Open Jobs</option>
            <option value="closed-jobs">Closed Jobs</option>
            <option value="waiting-for-invoice">Waiting for Invoice</option>
            <option value="all-jobs">All Jobs</option>
          </select>
        </div>
      </div>
    </form>
    <div id="activeJobTable" </div>
      <div class="col-md-8">
        <div class="row">
          <div class="col-lg-12" id="validation"></div>
        </div>
        <div class="row">
          <div id='jobDetails'>

          </div>
        </div>
      </div>
    </div>

还有open-jobs.php页面(其余都一样,只是查询变了):

<?php require 'libraries/database.php'; $query="SELECT jobs.*, customers.cust_name, customers.id FROM `jobs`
INNER JOIN customers ON jobs.customer = customers.id
WHERE status != 'Completed' ORDER by job_id" ; $jobs=$ mysqli->query($query) or die($mysqli->error . __LINE__); ?>



<table class="table table-hover jobTable" data-link="row">
  <thead>
    <tr>
      <th class="col-md-2">Job #</th>

      <th class="col-md-4">Customer Name</th>

      <th class="col-md-6">Description</th>
    </tr>
  </thead>
  <tbody>
    <?php while ($row=m ysqli_fetch_array($jobs)) { $jobid=$ row[ 'job_id']; $query="SELECT * FROM parts WHERE job = '$jobid' AND status != 'In Stock'" ; $result=m ysqli_query($mysqli, $query); $partrows=m ysqli_num_rows($result); if ($partrows>0) { $highlight = 'warning'; } else { $highlight = ''; } echo '
    <tr class="' . $highlight . '" id="row'.$row['job_id'].'">'; echo '
      <td>
        <a class="ajaxCall" href="#" rel="' . $row['job_id'] . '"></a>' . $row['job_id'] . '</td>'; echo '
      <td>' . $row['cust_name'] . '</td>'; echo '
      <td class="col-lg-2">' . $row['description'] . '</td>'; echo '</tr>'; } ?>
  </tbody>
</table>

【问题讨论】:

  • 我们可能应该查看您的 html 标记以了解您要执行的操作。
  • 编辑了我的问题以包含它:)

标签: javascript jquery ajax


【解决方案1】:

我想你想改变

$("#jobSorter").change(function() {
$("select option:selected").each(function() {

  if ($(this).attr("value") == "open-jobs") {

$("#jobSorter").change(function() {

  if ($(this).val() == "open-jobs") {

您不需要在每个选定选项上都有一个事件。当jobSorter 更改时,$(this).val() 将保留所选值。我不知道这是否是问题的根源,但你这样做的方式似乎是错误的。

所以

$(document).ready(function() {
$("#jobSorter").change(function() {

  if ($(this).val() == "open-jobs") {
    $.ajax({
      url: "jobs/open-jobs.php",
      success: function(data) {
        $("#activeJobTable").html(data);
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus);
        alert("Error: " + errorThrown);
      }
    });
  }

  if ($(this).val() == "closed-jobs") {
    $.ajax({
      url: "jobs/closed-jobs.php",
      success: function(data) {
        $("#activeJobTable").html(data);
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus);
        alert("Error: " + errorThrown);
      }
    });
  }

  if ($(this).val() == "waiting-for-invoice") {
    $.ajax({
      url: "jobs/waiting-for-invoice.php",
      success: function(data) {
        $("#activeJobTable").html(data);
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus);
        alert("Error: " + errorThrown);
      }
    });
  }
  if ($(this).val() == "all-jobs") {
    $.ajax({
      url: "jobs/all-jobs.php",
      success: function(data) {
        $("#activeJobTable").html(data);
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus);
        alert("Error: " + errorThrown);
      }
    });
  }
 });
});

因为你需要事件委托后将表加载到DOM,所以你需要改变

$(".jobTable").on("click", "tr", function() {

$(document).on('click','.jobTable tr",function() {

【讨论】:

  • 它不能修复它,但它确实看起来更好更高效。已更新,谢谢!
  • 我添加了一条评论。我更清楚地阅读了您的问题。这是因为您正在添加表格并尝试收听点击它们。在api.jquery.com/on 上阅读事件委托部分
  • 即:“委托事件的优点是它们可以处理来自以后添加到文档的后代元素的事件。通过选择一个保证在委托时存在的元素事件处理程序已附加,您可以使用委托事件来避免需要频繁附加和删除事件处理程序。...在加载任何其他 HTML 之前,文档元素在文档头部可用,因此在此处附加事件是安全的无需等待文档准备好。”
  • 这很有意义,但不幸的是它不起作用。当我单击表格行时仍然没有任何反应(是的,我修复了报价)。是否有理由将其放在 ajax 调用的完整部分中不起作用?似乎它仍在等待一切完成后再运行?
  • 这个&lt;div id="activeJobTable" &lt;/div&gt;在你的代码中真的像这样吗?
猜你喜欢
  • 2019-03-12
  • 2014-01-23
  • 2014-09-25
  • 1970-01-01
  • 2014-06-21
  • 2015-12-09
  • 2015-12-24
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多