重新使用jquery ajax调用获取旧数据

时间:2016-02-23 16:31:58

标签: javascript jquery ajax

我有一个ajax调用,在弹出窗口中构建一个小图。链接的html在页面上的不同设备的许多不同链接中重复使用。会发生什么,当您单击第一个设备的图表时,您将获得该设备。您单击第二个设备的按钮,即可获得该设备,但是,如果您继续单击,在第三次单击后,您会突然开始一次又一次地只获取第一个设备。我认为我的变量以某种奇怪的方式被缓存,我不明白:

HTML:

<a class="bluebtn graphbutton ingraph" href="http://wasat/cgi-bin/rrdjson.cgi?res=3600&start=-24h&end=now-1h&uid=28.7B2562040000" data-uid="28.7B2562040000" data-name="Laundry Room Freezer"></a>
<a class="bluebtn graphbutton ingraph" href="http://wasat/cgi-bin/rrdjson.cgi?res=3600&start=-24h&end=now-1h&uid=28.F7A962040000" data-uid="28.F7A962040000" data-name="Garage Temp"></a>

有问题的代码:

 $(document).ready(function() {
  $('.graphbutton').click(function(e) {
    var formURL = $(this).attr("href");
    var uid = $(this).data("uid");
    var name = $(this).data("name");

    e.preventDefault();
    $.ajax({
      url: formURL,
      dataType: "json",
      cache: false,
      context: this,
      success: function(data){
      console.log("calling mkgraph with uid "+uid+" name " +name);
      make_graph(data.data, uid, name);
    },
      error: function(ts) { 
      console.log(ts.responseText); }
      });
  }); /* clickfunc */
}); /*docready */

会发生什么:

Click freezer:
"calling mkgraph with uid 28.7B2562040000 name Laundry Room Freezer"
Click Garage:
"calling mkgraph with uid 28.F7A962040000 name Garage Temp"
Click Garage again:
"calling mkgraph with uid 28.7B2562040000 name Laundry Room Freezer" 

其中一些链接由make_graph()函数制作。我有点担心这是问题,不知何故ajax之后需要重新初始化吗?

根据请求,我认为make_graph()中的相关代码会导致我的问题。基本上,我正在动态编辑css弹出窗口中的按钮,我认为这创建了一个奇怪的情况,即ajax绑定绑定到旧的href,而不是更新,即使链接在生成中是正确的HTML。这与第三次尝试时绑定仅受到损坏的效果一致。

$(".ingraph").each(function() {
 this.href = $(this).attr("href").replace(/uid=.*/g, 'uid=' + uid);
 this.setAttribute('data-uid' ,uid);
 if (devname.length > 0) {
   this.setAttribute('data-name', devname);
 }
});

编辑:添加一个长答案:

主页上有多个按钮。每一个都指定一个“uid”,它被提供给rrdjson.cgi,它获取uid并找到该设备的数据,并将其作为json返回。当make_graph()收到这个json数据时,它会使用图形填充css弹出窗口,并编辑5个按钮,以便它们引用该UID。这5个按钮通过从rrdjson.cgi重新请求数据来更改图形的时间刻度。

我担心的是,我点击了frige,它会更改弹出窗口内按钮的uid以引用frige。然后我关闭它,点击车库,它也改变了uid并正确显示了车库数据。然后我点击车库弹出窗口中的一个按钮,然后噗,我再次拿到冰箱。我怀疑ajax“记住”$(this).attr(“href”)等的旧值并将这些值传递给代码,而不是重新读取HTML的内容。 (也许不是HTML,我的意思是那里的DOM,我对这个差异有点担心,但我怀疑我的意思是DOM)

也许答案是以某种方式取消注册ajax绑定到那些按钮并在每次make_graph()更改它时重新注册它?我如何取消注册? .off()? .unbind()?

2 个答案:

答案 0 :(得分:2)

经过大量咬牙切齿和谷歌之后,我已经回答了我自己的问题。

https://forum.jquery.com/topic/jquery-data-caching-of-data-attributes

事实证明,jquery缓存“数据”类型,但不缓存attr类型。所以当我这样做时:

uid = $(this).data(“uid”);

VS

uid = $(this).attr(“data-uid”);

我得到了截然不同的结果。我想这个故事的寓意是.data是超级邪恶的.. :)

答案 1 :(得分:1)

如果您向网址添加随机值,例如

var formURL = $(this).attr("href")+"?rv="+Math.random();

你将强制ajax调用重新加载URL。您可以使用缓存属性(将其设置为false)JQuery将再次加载数据,但任何代理都可以发送缓存版本。

(请检查网址中是否设置了其他属性,否则请设置"&rv="+Math.random();(&amp;而不是?)使用

var formURL = $(this).attr("href");
formURL + (formURL.indexOf("?") > 0 ? "&rv=" : "?rv=" )+ Math.random();

你的问题不应该与make_graph()有关,因为uid和name取决于$('。graphbutton')

(如果不是make_graph()或其他一些功能,则更改按钮的属性)