Javascript 在后台执行HTTP请求而不加载网页?

Javascript 在后台执行HTTP请求而不加载网页?,javascript,http,get,Javascript,Http,Get,因此,这个第三方网站包含一个按钮,单击该按钮时,会发送GET请求,并执行一些服务器端任务,将登录用户的数据更新到其数据库中。必须在每个日历日执行所需的任务。有没有其他方法可以让此网站的服务器执行任务,而不让它在每个日历日加载页面?附加到该按钮的URL似乎使用REST API,因为button元素具有hrefURL,其中包含路径+参数。目前,让它为我执行服务器端任务的解决方案是更改URL的参数并在新的浏览器选项卡中打开该URL 更准确地说,url看起来像这样:https://something.c

因此,这个第三方网站包含一个按钮,单击该按钮时,会发送GET请求,并执行一些服务器端任务,将登录用户的数据更新到其数据库中。必须在每个日历日执行所需的任务。有没有其他方法可以让此网站的服务器执行任务,而不让它在每个日历日加载页面?附加到该按钮的URL似乎使用REST API,因为button元素具有
href
URL,其中包含路径+参数。目前,让它为我执行服务器端任务的解决方案是更改URL的参数并在新的浏览器选项卡中打开该URL

更准确地说,url看起来像这样:
https://something.com/somepath/47240/6/sort?date=2018-03-06&crump=JMBuREVDPqS
我发现,只要将date参数改为第二天,并在浏览器中加载该URL,该网站的服务器也会在第二天执行所需的任务。有没有一种方法可以让它在后台执行此任务,而无需每天加载单独的选项卡,或者操纵date参数并在单独的选项卡中打开更新的URL是唯一的解决方案?因为我当前的方法只是打开更新的日期URL,所以它完全是通过客户端代码实现的。因此,我想知道仅使用客户端代码的替代解决方案

使用Ajax

var http = new XMLHttpRequest();
var url = "Put url here";
var params = 'Put Params here'
http.open("POST", [url,params].join('?'), true);
  • 生成要调用的日期数组
  • 迭代每个日期,并向服务器发出请求
  • 完成请求后,选择下一个日期并进行处理
  • 下面是示例代码,您可以根据自己的情况进行修改

      var url="https://something.com/somepath/47240/6/sort?date=";
      var date1 = new Date();
      var date2 = new Date(2018, 1, 1);
      var day;
      var between = [date1];
     //Generate the date array for which you want to run
      while(date2 <= date1) {
          day = date1.getDate()
          date1 = new Date(date1.setDate(--day));  
          between.push(date1);
      }
    //Covert date to string format for passing to the request url
    function formatDate(date) {
        var d = new Date(date),
            month = '' + (d.getMonth() + 1),
            day = '' + d.getDate(),
            year = d.getFullYear();
    
        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;
        return [year, month, day].join('-');
      }
    
      var callPage = function (dt) {
           return new Promise(function (resolve, reject) {
              var xhr = new XMLHttpRequest();
              var urlWithParam=url+ dt + "&crumb=JMBuREVDPqS";
              xhr.open('GET', urlWithParam, true);
              xhr.onload = function () {
                //Resolve the promise, so that next can be picked
                 resolve();
              };
    
            });
          };
        //Make the call for each date.
        for (var i = 0; i < between.length; i++) {
            callPage(between[i]).then(function () {
          });
        }
    

    你可以这样做

    1) 设置每天调用函数一次的间隔

    2) 每天调用函数后,必须动态增加日期

    var dayInMilliseconds = 1000 * 60 * 60 * 24;
    var todayDate = new date();
     function formatDate(todayDate ) {
      var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();
    
     if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;
    
    return [year, month, day].join('-');
    }
    setInterval(function() { 
    $.get("https://something.com/somepath/47240/6/sort", 
    {"date":formatDate(todayDate),"crumb":"JMBuREVDPqS"},
    function(response){
    console.log("http request loaded in the background")'
    });
     },dayInMilliseconds );
    
    var dayin毫秒=1000*60*60*24;
    var todayDate=新日期();
    函数formatDate(今天日期){
    var d=新日期(日期),
    月份=“”+(d.getMonth()+1),
    日期=“”+d.getDate(),
    year=d.getFullYear();
    如果(月长<2)月='0'+月;
    如果(日长<2)天='0'+天;
    返回[年、月、日]。加入('-');
    }
    setInterval(函数(){
    $.get(”https://something.com/somepath/47240/6/sort", 
    {“日期”:formatDate(todayDate),“crumb”:“JMBuREVDPqS”},
    功能(响应){
    log(“后台加载的http请求”)'
    });
    },以毫秒计);
    
    尝试使用Ajax。您能更精确一点吗?我以前没有使用过AJAX,所以可能一些示例代码会有所帮助。这里使用的
    params
    是什么?你声明了它,但没有使用它。用url+'?'+param替换url我认为它很常见,但不适合某人。我尝试使用这段代码在我制作的示例HTML页面上进行测试。在那个HTML页面中,我输入了一个硬编码的URL,其中一个日期的任务还没有执行。我使用
    onClick
    将一个JS函数附加到它,该函数被调用,但在刷新第三方页面后,我没有看到任何变化。此外,您不必担心URL管理部分。我只是想要在
    onload
    块下面提供我应该拥有的URLAm
    xhr.send(null)
    来发出HTTP请求的代码?我已经用iframe实现更新了答案,您也可以检查一下。它应该对你有用。iFrame一个有效!谢谢谢谢谢谢!!您试图通过iframe访问的网站不属于您的域和X-Frame-Options:SAMEORIGIN将出现在标题中。我怀疑你们能否避免,这是一个由浏览器实现的安全功能,以避免点击劫持。但是对于您的场景,iframe不需要任何UI,因此可以忽略它。