自定义事件触发的ajax调用会保留先前调用的数据

时间:2014-02-26 10:44:00

标签: javascript jquery ajax events triggers

早上好,我在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()被解雇后重置处理程序?

任何人都有这个想法吗?

1 个答案:

答案 0 :(得分:-1)

据我所知(这是一个随机的故事),你正在寻找id,名字或类。 你把它们放在一个变量中,如果按下你就发出一个AJAX调用。 你的问题是:为什么你会得到任意名称和其他数据。

可能是类不是唯一的。因此,当你打电话给一个班级时,它可以被分享,从而请求另一个班级。它可以解释任意名称,看你要求课程,而不知道你需要哪一个(据我所知)。

添加数据trackid可能会更好。这样你可以控制id是什么,你可以随时回到你需要的那个。更重要的是,它是独特的,这就是跟踪的全部意义。