【问题标题】:Ajax from jquery to javascript从 jquery 到 javascript 的 Ajax
【发布时间】:2019-12-12 02:20:42
【问题描述】:

我想将一个 ajax 函数从 jquery 转换为纯 javascript

我已经尝试过了,但它的反应方式与我尝试使用普通 js 时 url 没有收到响应的方式不同

这是我的 jquery

(function ($){
try{
        var event_category = 'a';
        var event_name = 'b';
        var page_url = 'c';
        var url = "myurl";
        var data = {
                event_category: event_category,
                event_name: event_name,
                page_url: page_url
        };
        $.ajax({
                crossDomain: true,
                type: "POST",
                url: "myurl",
                data : {event_category: event_category, 
                        event_name: event_name, 
                        page_url: page_url
                        }
        });
  } catch(e){console.log(e)};  
})(jQuery);

这是我尝试过的

var event_category = 'action';
var event_name = 'click';
var page_url = 'test';
var request = new XMLHttpRequest();
request.open('POST', 'myurl');
request.setRequestHeader("Content-Type", "application/json; utf-8");
          params = {
              event_category: event_category, 
              event_name: event_name, 
              page_url: page_url
              } 
request.send(JSON.stringify(params));

不知道我应该改变什么

编辑:

基于我在开发者工具上检查网络数据的其中一个 cmets jquery 对此格式的标题有响应 enter image description here enter image description here

但是javascript发送的数据是这种格式

enter image description here

基本上,javascript 不会以 url 参数格式发送它。不知道如何强制它以相同的格式发送它

【问题讨论】:

  • 你有什么错误吗?
  • 没有错误,事实上我有一个nodejs服务器,当我在jquery上做它时接收信息,但如果我用纯javascript做它不会收到它,所以我想知道是否转换我所做的就是缺少一些东西。
  • 所以基本上网络调用本身没有触发不是
  • 在浏览器的开发者工具中打开网络标签。运行有效的 jQuery 代码并查看请求 URL 和标头显示的内容。将它们复制到文本编辑器或视觉比较程序中。现在对新的 JavaScript 代码做同样的事情。您应该能够立即看到两者之间的不同之处。
  • @MichaelGeary 谢谢你让我走上了正轨。 jquery 将此数据返回格式 event_category=a&event_name=b&page_url=c 但 javascript 给出此 {"event_category":"d","event_name":"e","page_url":"f"}

标签: javascript jquery ajax fetch-api


【解决方案1】:

有什么理由不使用 fetch API(它可以在蹩脚的浏览器中填充...)?

const ajax = async function(url, data) {
  try {

    const response = await fetch(url, {
      credentials: 'include', // like jQuery $.ajax's `crossDomain`
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      // this mimics how jQuery sends POST data as querystring by default
      body: Object.entries(data).map(([key, val]) => `${key}=${val}`).join('&'),
    });

    data = await (
      response.headers.get('content-type').includes('json')
      ? response.json()
      : response.text()
    );

    console.log(data);

    return data;
  } catch(err) { console.log(err) };
}

ajax('myurl', {
  event_category: 'a', 
  event_name: 'b', 
  page_url: 'c',
});

【讨论】:

  • No @exside 我可以使用 fetch API 并且您的解决方案很优雅。但它仍然不能解决问题。我编辑了一些图像,如果我们查看网络数据,jquery 和 javascript 的标头响应不一样,但我看不出如何使其相似
  • @我需要数据检查上面更新的sn-p,带有Object.entries()的部分,它应该模仿jQuery默认发送POST数据的方式(作为查询字符串)并替换JSON.stringify()以前有!如果您不能使用Object.entries(),则可以使用具有更好浏览器支持的Object.keys() 来做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2012-08-21
  • 2012-05-19
  • 2016-12-02
相关资源
最近更新 更多