早上好,我在jquery开发的跟踪系统有问题。这背后的主要思想是将一个处理程序绑定到可以单击的许多元素,一旦单击处理程序,就会根据单击的元素获取代码,并对记录代码和时间的PHP脚本进行ajax调用。
这工作正常,但我突然意识到页面上的元素通常没有任何id,或名称或类(或具有任意的),这些是我想要“跟踪”的属性。 所以,由于大多数时候这些匿名页面元素都有一个处理行为的javascript,我想到了一个事件触发器,放入那些应该触发我的跟踪javascript的javascripts。
我的一部分问题是,大多数这些页面,javascripts等都是不可触及的,所以我很难整合这种跟踪,而不会触及任何东西(或者大多数东西)。
现在,有些代码,这是ajax调用本身:
function XJAX(strUrl,kpi,isAsync) {
if (isAsync == "true") {isAsync = true;} else {isAsync = false;}
console.log("xjax called");
xhr = $.ajax({
url: strUrl,
type: 'GET',
cache:false,
data: { kpiName: kpi },
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
jsonp: "callback",
jsonpCallback: "callbackLog",
async:isAsync
});
if(isAsync == false){
setTimeout(function(){
try{
xhr.abort();
console.log("xhr aborted");
}catch(e){}
},800);
}
}
这是一个jsnop结构,可以从中获取一些数据:
kpiList = $.parseJSON('{"idkpi":{"termkk":{"kpi":"id1111termkk","asynk":"true"}, "termww":{"kpi":"id2222termww","asynk":"false"}, "secondClick":{"kpi":"id8888secondClick","asynk":"true"}, "firstClick":{"kpi":"id7777firstClick","asynk":"false"} }, "classkpi":{"birms":{"kpi":"cl3333","asynk":"false"},"gurp":{"kpi":"cl4444","asynk":"true"} },"namekpi":{"genericLink":{"kpi":"na55555","asynk":"false"},"anotherThing":{"kpi":"na66666","asynk":"true"} }}');
现在我已经写了这个应该跟踪自定义事件的处理程序:
$(document).bind('trackme',function(eventFire,elementToBeTracked){
console.log('track ' + elementToBeTracked);
kpiN = false;
asynk = true;
try{
kpiN = kpiList["idkpi"][elementToBeTracked]["kpi"];
asynk = kpiList["idkpi"][elementToBeTracked]["asynk"];
if (!kpiN){
kpiN = kpiList["namekpi"][elementToBeTracked]["kpi"];
asynk = kpiList["namekpi"][elementToBeTracked]["asynk"];
}
if (!kpiN){
kpiN = kpiList["classkpi"][elementToBeTracked]["kpi"];
asynk = kpiList["classkpi"][elementToBeTracked]["asynk"];
}
if((typeof kpiN !== 'undefined') && (kpiN !== '')){
XJAX(url,kpiN,asynk);
}
}catch(e){}
});
在这种情况下:
<button id="first" type="button">first click</button>
<button id="start" style="display:none" type="submit">second click</button>
$(document).ready(function(){
$('#first').click(function() {
$(document).trigger( "trackme", "firstClick" );
$('#first').hide();
$('#start').show()
});
$('#start').click(function() {
$(document).trigger( "trackme", "secondClick" );
});
});
发生这种情况:
第一次单击激活核心调用,ajax调用触发远程脚本,所有内容都以“firstClick”的名称记录。
第二次单击,从第一次调用返回一些参数,返回一个空对象,然后记录正确的调用,但没有调用,也返回一个空对象。
--------first click is done-------------
track firstClick
Object {readyState: 1, setRequestHeader: function, getAllResponseHeaders: function, getResponseHeader: function, abort: function…} <---- this is a full object, all works fine
xjax called
Resource interpreted as Script but transferred with MIME type text/html: "a server"
xhr aborted
-----------end---------------
----------second click--------
xjax called
Object {readyState: 1, setRequestHeader: function, getAllResponseHeaders: function, getResponseHeader: function, abort: function…} <---- empty object
track secondClick
xjax called
Object {readyState: 1, setRequestHeader: function, getAllResponseHeaders: function, getResponseHeader: function, abort: function…} <---- empty object
---------end------------------
在另一个文件,日志中,我发现第一次点击的ID是两倍,而第二次点击的ID不是。
“abort”thingy是我试图处理同步调用和阻止浏览器的事情,这样我就有机会不会阻塞太多。
奇怪的是,第二次调用会保留第一次调用的一些数据,这与在没有触发函数的情况下调用xjax时的行为不同。它应该与事件有关吗?我的意思是,也许我必须在trigger()
被解雇后重置处理程序?
任何人都有这个想法吗?
答案 0 :(得分:-1)
据我所知(这是一个随机的故事),你正在寻找id,名字或类。 你把它们放在一个变量中,如果按下你就发出一个AJAX调用。 你的问题是:为什么你会得到任意名称和其他数据。
可能是类不是唯一的。因此,当你打电话给一个班级时,它可以被分享,从而请求另一个班级。它可以解释任意名称,看你要求课程,而不知道你需要哪一个(据我所知)。
添加数据trackid可能会更好。这样你可以控制id是什么,你可以随时回到你需要的那个。更重要的是,它是独特的,这就是跟踪的全部意义。