我有一个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()?
答案 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()或其他一些功能,则更改按钮的属性)