代码之家  ›  专栏  ›  技术社区  ›  Matthias Güntert

如何简化javascript和ajax调用?

  •  -1
  • Matthias Güntert  · 技术社区  · 4 年前

    我有几个演示应用程序的按钮

    <div style="margin-top: 10px;" class="text-center">
        <h3>Events</h3>
        <button id="trackTrace" class="btn btn-warning">TrackTrace()</button>
        <button id="trackException" class="btn btn-warning">TrackException()</button>
        <button id="trackEvent" class="btn btn-warning">TrackEvent()</button>
    </div>
    

    现在,我想在单击其中一个按钮时发出AJAX调用。我按如下方式解决了这个问题。

    <script>
        $("#trackTrace").click(function () {
            $.ajax({
                url: "/api/event/trace",
                type: "GET",
                success: function (result, status, xhr) {
                    $("#message").text("Success").show();
                },
                error: function (xhr, status, error) {
                    $("#error").text("Error").show();
                }
            })
        });
    
        ... 
    </script>
    

    然而,这似乎打破了DRY原则,我不想对每个按钮重复这一点。当然,我可以将文本的显示转移到一个单独的功能中。

    但是,以下调用 showError() showSuccess() 即使AJAX调用很好。

    function showSucess(result, status, xhr) {
        $("#message").text("Success").show();
    };
    
    function showError(xhr, status, error) {
        $("#error").text("Exception thrown on Backend-API!").show();
    };
    
    $("#trackTrace").click(function () {
        $.ajax({
            url: "/api/event/trace",
            type: "GET",
            success: showSucess(),
            error: showError()
        })
    });
    

    那么,我该如何简化代码呢?我正在寻找 switch 就像点击按钮一样。

    2 回复  |  直到 4 年前
        1
  •  1
  •   mplungjan    4 年前
    1. 在分配中使用事件处理程序时不需要具有() success: showSuccess, -或者它必须返回一个函数
    2. JS和jQuery内置了委托
    $("#eventContainer .track").on("click", function () {
        $.ajax({
            url: "/api/event/" + this.dataset.url,
            type: "GET",
            success: showSucess,
            error: showError
        })
    })
    
    <div id="eventContainer" style="margin-top: 10px;" class="text-center">
        <h3>Events</h3>
        <button id="trackTrace" class="track btn btn-warning" data-url="tracktrace">TrackTrace()</button>
        <button id="trackException" class="track btn btn-warning" data-url="trackexception">TrackException()</button>
        <button id="trackEvent" class="track btn btn-warning" data-url="trackevent">TrackEvent()</button>
    </div>
    
        2
  •  1
  •   NoOorZ24    4 年前

    HTML:

    <div style="margin-top: 10px;" class="text-center">
        <h3>Events</h3>
        <button data-url="/api/event/trace" class="btn btn-warning">TrackTrace()</button>
        <button data-url="/api/event/exception" class="btn btn-warning">TrackException()</button>
        <button data-url="/api/event/event" class="btn btn-warning">TrackEvent()</button>
    </div>
    

    JS:

    $("button[data-url]").each(function () {
        const clickedElement = this;
        $(this).click(function () {
          $.ajax({
              url: clickedElement.dataset.url,
              type: "GET",
              success: function (result, status, xhr) {
                  $("#message").text("Success").show();
              },
              error: function (xhr, status, error) {
                  $("#error").text("Error").show();
              }
          })
      });
    });
    

    请注意,您不需要分配 id 到你的按钮。此外,我也不能100%确定语法是否正确,因为我已经有一段时间没有使用jQuery了