我怎样才能获得调用ajax请求的源元素" ajaxComplete"处理器

时间:2012-12-03 08:19:23

标签: jquery

我正在这个网站上开发一个基于ajax的网站我通过ajax调用创建了所有请求页面的历史记录。经过一个小时的搜索,我得到了一个Histroy.js lib来管理我的状态。 但我的问题是获取调用ajax并仅更新div块的元素。 所以我想要这样的东西。

<a href="a.php" class="ajax" data-block-to-update="a_block"> 
<div id="a_block">

当用户点击此链接时,应该进行ajax调用,在获得响应后我必须更新id为“a_block”的div

这是我的脚本

<script>
    $(document).ready(function(){
        var History = window.History;
        var State = History.getState();
        var $log = $('#log');

        History.pushState({state:'1',rand:Math.random(),content:$('#main').html(),block:'main'}, 'index', State.url);
        //History.log(State.data, State.title, State.url);

        $('.ajax').live('click',function(){
        var gen_url = $(this).attr('href');
        var bl = $(this).attr('data-block');
            $.ajax({
                url: gen_url,
                success: function(data) {
                    console.log($(this));
                  $('#'+bl).html(data);
                  History.pushState({state:gen_url,rand:Math.random(),content:data,block:bl}, gen_url, gen_url);
                }
                  });
        return false;
        });

        $.ajaxSetup({

              });

        $(document).bind("ajaxComplete", function(e, xhr, settings){
                            // need to get element which make ajax request
            console.log(xhr);
            //var obj = $(e.target.activeElement);
            //alert(obj.attr('data-block'));

        });

        History.Adapter.bind(window, 'statechange', function() {
            var State = History.getState();
            if(State.data.content!="" && State.data.block!="")
            {
                //History.log(State.data, State.title, State.url);
                $('#'+State.data.block).html(State.data.content);
            }
            else
                return false;
        });
    });

</script>

如何在“ajaxComplete”事件处理程序中获取调用ajax请求的元素?

2 个答案:

答案 0 :(得分:0)

如果我理解你的话,我可以想到两种解决方法,一种比另一种更优雅。

第一个是拥有一个捕获所有数据的php文件,因为你使用的是jQuery,我会使用http://api.jquery.com/jQuery.post/

你的问题有点分散,你想收集什么信息,如果你想要href数据,我会写这样的东西收集所有元素:

$('a[href]');

您可以使用bind添加事件侦听器: http://api.jquery.com/bind/

$('a[href]').bind('click', function()
{
    saveHistory();
    document.location = this.href;
});

并设置链接'onclick'以返回false,在这种情况下,当您点击链接时,您不会转移到网站,转移可以由javascript处理。

然而,我以前从未这样做过,这只是我对这个问题的快速思考。 希望它可以得到一些帮助。

答案 1 :(得分:0)

根据我的理解,你的问题是将对象传递给另一个函数。

如果是这样,您需要在第一个函数之外声明一个变量,并使用该函数将数据保存在该变量中。在函数中初始化的所有变量都将在其末尾删除。

在您的情况下,我会说您的代码只有一点变化:

<script>
$(document).ready(function(){
    var ajax_element;
    // Do all you need as before…

    $('.ajax').live('click',function(){
    ajax_element = $(this);
    var gen_url = $(this).attr('href');
    var bl = $(this).attr('data-block');
        $.ajax({
            url: gen_url,
            success: function(data) {
                console.log($(this));
              $('#'+bl).html(data);
              History.pushState({state:gen_url,rand:Math.random(),content:data,block:bl}, gen_url, gen_url);
            }
              });
    return false;
    });
    // Etc…

    $(document).bind("ajaxComplete", function(e, xhr, settings){
        // need to get element which make ajax request ->
        // the element you want to catch here is: ajax_element
        console.log(xhr);
        //var obj = $(e.target.activeElement);
        //alert(obj.attr('data-block'));

    });
})
</script>

在完成ajax调用之前,您仍然需要保持第二个函数不会触发。我建议你创建一个你可以在你的ajax成功函数中调用的函数,以确保它不会被提前触发(如果它必须在之后被触发)。

此外,当我使用链接时,我建议从一开始就阻止正常的事件传播,有些浏览器会在执行JS提出的操作之前传播操作。