【问题标题】:I can't understand AJAX calls for the life of me [duplicate]我无法理解 AJAX 需要我的生命 [重复]
【发布时间】:2017-09-18 13:00:08
【问题描述】:

好的,请原谅这个戏剧性的标题,但是在我的编码之旅中,进行 AJAX 调用肯定是我最困惑的事情。

我正在完成一个项目,用户在搜索栏中输入关键字并使用 Wikipedia API 返回结果。我看过几个关于进行 AJAX 调用的教程并浏览了文档,但它只是没有点击。

当我试图弄清楚这一点时,我脑海中出现的主要问题:

AJAX 调用到底应该包含什么内容,我该如何找出答案?我浏览了文档并知道可以在 AJAX 调用中指定许多设置,但是如何确定需要使用哪些设置?这些设置是什么意思?!

我知道这对大多数人来说可能是一个愚蠢的问题,但我才刚刚开始并想学习!

老实说,这就是我所拥有和目前理解的全部内容:

$(function() {

  // make ajax request
  $.ajax({
    url: "https://en.wikipedia.org/w/api.php", // this is the API endpoint
    dataType: json;
  });

});

【问题讨论】:

  • 给我们一些代码示例
  • 这与向服务器提交表单没有什么不同。你把你想要的数据发送出去。自 2005 年我写了一本关于 Ajax 的书以来,有很多关于 Ajax 的教程。您对哪些设置感到困惑?您现在可能关心的只是方法、数据、成功和错误。
  • 更新了我目前的代码
  • 所以你漏掉了success或者done()看黄框下的例子代码:api.jquery.com/jquery.ajax/#jqXHR或者例子api.jquery.com/jquery.ajax/#entry-examples
  • 要找到我们在 Ajax 请求中的确切内容,您必须阅读 api 提供者的文档。他们可能会要求您使用这个或那个参数以及您可以指定的内容等等。

标签: javascript jquery ajax


【解决方案1】:

什么是 AJAX 请求?

Ajax 是一组使用许多 Web 的 Web 开发技术 在客户端创建异步 Web 的技术 应用程序。

使用 Ajax,Web 应用程序可以向 服务器异步(在后台)而不干扰 现有页面的显示和行为。

考虑AJAX 请求的方式与考虑HTTP 请求的方式相同。您只是在请求位于服务器上的文件、文本或任何其他资源。

为什么要使用 AJAX 请求?

它们为用户体验、功能和性能带来了好处。

例如,假设您正在尝试构建一个文本消息应用程序。要构建这样的东西,您需要让新的文本消息出现在页面上,而用户不需要做任何事情。这称为:动态加载的内容。

这可以通过AJAX 来实现。

如何发出 AJAX 请求?

通过使用 JavaScript 框架 jQuery,我们可以让体验变得更轻松。这是带有jQuery AJAX 的基本AJAX 请求。

$.ajax({ *properties* });

AJAX 方法需要一些属性:

  • URL:您要从中提取信息的来源。
  • Method:您要使用的请求方法。 (POST, GET, PULL)
  • 数据:您希望发送到源的数据。

还有很多,但为了简单起见,我只列举这些。

假设您想创建一个不刷新页面的登录系统。这真的很简单!

首先,我们需要设置后端。

if (isset($_POST['username']) && isset($_POST['password'])) {

    $username = $_POST['username'];
    $password = $_POST['password'];

    if ($username == 'USER' && $password == 'PASS') {
        echo('success');
    } else {
        echo('failure');
    }
}

将其保存在名为 login.php 的文件中。

其次,我们来设置前端。

<form method="POST" action="login.php">
    <input name="username" type="text" placeholder="Username">
    <input name="password" type="password" placeholder="Password">
</form>

我们现在有了ÀJAX 请求的基础。在我实现之前,先说一下PHP和HTML是做什么的。

HTML 有一个表单,它有两个输入,用户名和密码。从属性可以看出,表单会使用POST方法将数据发送到login.php。 PHP 将检查它们是否已设置,以及它们是否正确。

不幸的是,这种设置导致了最令人讨厌的网站功能之一。 刷新

我们如何解决这个问题? AJAX 宝贝!

首先,移除表单上的属性。

<form>
    <input name="username" type="text" placeholder="Username">
    <input name="password" type="password" placeholder="Password">
</form>

其次,添加submit事件监听器。

$('form').submit(function(event) {


});

第三,在事件上添加preventDefault(),停止页面刷新。

$('form').submit(function(event) {

    event.preventDefault();

});

第四,获取表单值。

$('form').submit(function(event) {

    event.preventDefault();

    var $form = $(this);
    var username = $form.find('input[name="username"]').val();
    var password = $form.find('input[name="password"]').val();
});

第五,添加AJAX

$('form').submit(function(event) {

    event.preventDefault();

    var $form = $(this);
    var username = $form.find('input[name="username"]').val();
    var password = $form.find('input[name="password"]').val();

    $.ajax({
        url: 'login.php',
        method: 'post',
        data: { username: username, password: password },
        success: function(response) {
            alert(response);
        }
    });

});

这将在提交表单时将数据发送到login.php 文件。如果设置了值,PHP 将回显(或将数据提供给 AJAX)状态。它将根据用户名和密码的准确性返回successfailure

希望这有帮助!它花了很长时间。

【讨论】:

    【解决方案2】:

    好的,我不是“Ajax 大师”,但这里有一个如何使用它的示例,希望对您有所帮助。

    假设您有一个简单的 HTML 登录表单:

    <form method="POST" name="connexion" id="connexion">
      <input type='text' id='add_url' name="add_url" required/>
      <label for="add_url">Add URL</label>
      <input type="submit" name="sub_add" value="Add">
    </form>
    

    现在我有一个 .js 文件,我想在其中检查添加的值是否良好,如果可以,我想显示结果,但我不想重新加载我的页面。所以我会打一个 Ajax 调用:

    function add_url () {
      var data = $('input[name = "add_url"]').val(); // Here I select my input "add_url" and put the value on my var "data"
    
      $.ajax({
        type: "POST",          // How I want to send my data on my php page
        url: "mypage.php"      // the name of the file where I will use this data
        data: {"add" : data},  // The data I will use in my php, with the name "add"
        dataType: "json",      // The type of data I want to receive
        success: function(response) {
    
        // If my ajax call worked, I will do some code here
    
        },
        error: function (xhr, status, msg) {
    
       // If my ajax call failed, I want to know why so I will use "xhr, status and msg" to have some information about why it failed
    
        }
      });
    }
    

    现在在我的 php 中,我将使用 ajax 发送的数据并构建一个 JSON 响应:

    // mypage.php
    <?php
    $url = $_POST['add']; // I put the data send in my var $url
    
    // you do some code here with your data, for example I add the new URL in some array and the new array is $data
    
    $result['status'] = "success";      // All is ok so I say it
    $result['message'] = "All is ok !"  // I add some message
    $result['data'] = $data;            // The data I will use in my JS
    
    $result = json_encode($result);     // I need a JSON as response, remember?
    
    echo $result;                       // My response
    
    ?>
    

    现在在我的 ajax 函数中,如果一切正常,我可以使用我在成功部分发送的内容:

     success: function(response) {
    
        if (response.status === "success") {   // I test if the status I send is "success"
          alert(response.message);             // The message I send
          console.log(response.data);          // I want to see in my console the data I receive
        }
    
     }
    

    这只是一个例子,但我希望你对如何使用它有更好的了解:)

    【讨论】:

    • 为什么要把它和php混为一谈呢? OP 已经很困惑了,现在可能更困惑了!
    • 你觉得呢?我虽然使用带有 php 文件的 Ajax 是理解它的最简单方法!他们就是这样在课堂上向我解释的。我希望您对 OP 的看法是错误的:s
    • 他们试图使用wikipedia API - 为什么不举个例子来调用它呢?无论如何,这是关闭的,所以可能没有意义
    【解决方案3】:

    这里很难回答这个问题,写一下AJAX的所有配置的使用。我建议您总体上了解HTTP Request。它是如何工作的,所有标题都有什么以及它们的用途。 HTTP requestsAJAX 上有这个不错的教程。请查看https://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest--net-1634。继续使用和探索AJAX 电话。随着时间的推移你会学会的。

    【讨论】:

      【解决方案4】:

      这个问题已经结束,所以我希望其他正在学习 ajax 的新手 并且不是在寻找 jQuery 解决方案会从这个页面得到一些想法

      Asynchronous Javascript And XML (AJAX) 是在不停止整个代码执行的情况下运行的东西(简而言之,AJAX 是异步的)。

      在普通的 JavaScript 中,代码是同步执行的。这意味着一个代码不能在执行之前的代码之前执行。

      但是,在 AJAX 中,ajax 代码之后的代码仍然会执行,即使 ajax 代码还没有执行完。

      jQuery 的$.ajax 方法基本上就是下面过度简化的JavaScript:

      function ajax(settings){
          var ajax = new XMLHttpRequest(),     // initializing AJAX constructor
              header = 'application/x-www-form-urlencoded';
          ajax.addEventListener('readystatechange', function(e){
              if (this.readyState == 4){       // if request is ready
                  if (this.status == 200)      // if request is successful
                      settings.success(this);  // run `success` function
                  else                         // if request is unsuccessful
                      settings.fail(this);     // run `fail` function
              }
          });
          if (settings.dataType === 'json') header = 'application/json';
          ajax.open(settings.type, settings.url, settings.async);  // opens connection with the server
          ajax.setRequestHeader('Content-Type', header);           // sets ajax request header
          ajax.send(settings.data);                                // sends data to server
      }
      
      ajax({
          type: 'POST',
          url: 'api.php',
          dataType: 'json',
          data: {},
          async: true,
          success: function(e){
              alert('Ajax successful');
          },
          fail: function(e){
              alert('Ajax failed');
          }
      });
      

      上面的代码解释了 AJAX 是什么。下面的代码解释了异步的含义。

      如果 ajax 设置为同步

      var a = 0;
      
      a += 1;
      
      ajax({
          type: 'POST',
          url: 'api.php',
          dataType: 'json',
          data: {},
          async: false,          // async is set to false
          success: function(e){
              a += 10;
              console.log(a);
          },
          fail: function(e){
              alert('Ajax failed');
          }
      });
      
      a += 2;
      
      console.log(a);
      

      几秒钟后(因为等待服务器的响应),控制台会在控制台中记录两个13。这是因为a += 2 只会在ajax() 的执行结束后才会执行。

      但是,如果将 ajax 设置为异步

      var a = 0;
      
      a += 1;
      
      ajax({
          type: 'POST',
          url: 'api.php',
          dataType: 'json',
          data: {},
          async: true,           // async is set to true
          success: function(e){
              a += 10;
              console.log(a);
          },
          fail: function(e){
              alert('Ajax failed');
          }
      });
      
      a += 2;
      
      console.log(a);
      

      控制台将立即首先记录3,然后在几秒钟后记录13。这是因为当ajax() 正在等待服务器的响应时,a += 2 和后面的代码仍在执行,即使ajax() 仍在执行(等待服务器的响应)。一旦服务器响应,它将只执行a += 10 和另一个console.log(a)

      当然,要发出有意义的 ajax 请求,您需要在服务器端编写一些代码。

      假设我们有一个来自api.php 的假api:

      if (isset($_POST['hello']) && isset($_POST['foo'])){
          $array = [
              'one' => $_POST['hello'],
              'two' => $_POST['foo'];
          ];
      }
      echo json_encode($array);
      

      然后在 JavaScript 中:

      ajax({
          type: 'POST',
          data: {
              hello: 'world',
              foo: 'bar',
          },
          success: function(response){
              console.log(response);
          },
      });
      

      然后控制台将记录类似以下内容:

      {
          'one': 'world',
          'two': 'bar',
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多