load()API调用函数回调范围

时间:2011-05-20 09:53:57

标签: javascript jquery ajax jquery-callback

我已经在JS编写了一段时间,但不知怎的,我总是得到一些“刮头”类型的问题。我认为我需要做一些挖掘,但同时有人可以帮助这个吗?

所以这就是问题: 我正在通过项目(由$(this)得到)进入回调函数。这段代码不起作用 - 当我真的认为它应该。既然我已将$(this)放入变量(克隆数据?)然后通过函数将其传递给回调,那么它肯定不会丢失数据吗?但确实如此,而且可怕。

// Allow hrefs with the class 'ajax' and a rel attribute set with a selector to load via ajax into that selector.
$(".ajax").unbind("click").click
(
    function(e)
    {

        var locationhint = $(this).attr("rel");            
        var $location = $(locationhint);
        $location.html ("<img src='images/blockloading.gif' />");            
        $location.load($(this).attr("href").replace("index.php", "ajax.php"), '', function($location){dready($location);}); 
        e.preventDefault();
    }
); 

现在无效

这个有效:

$(".ajax").unbind("click").click
(
    function(e)
    {             
        $("#myspecificdiv").load($(this).attr("href").replace("index.php", "ajax.php"), '', function(){dready($("#myspecificdiv"));}); 
        e.preventDefault();
    }
); 

我认为它是一个范围问题,但我也做了这个,应该工作,因为它与上面的'静态'完全相同,基本上,因为它传递了文本ID元素。 这个也破了:

$(".ajax").unbind("click").click
(
    function(e)
    {
        var locationhint = $(this).attr("rel");            
        var $location = $(locationhint);
        $location.html ("<img src='images/blockloading.gif' />");  
        var locationid = "#" + $location.attr("id");
        $location.load($(this).attr("href").replace("index.php", "ajax.php"), '', function(locationid){dready($(locationid));});
        e.preventDefault();
    }
); 

破解的,当我在console.log locationid时,返回目标DIV的内部HTML。 $ location.attr( “ID”);当没有其他地方没有调用它时,无法返回原始HTML吗?所以它是我的范围吗?但那么如何让内部HTML吐出来呢?

任何解决方案?

更新 在我发布这个12秒后,我发现函数($ location){dready($ location);}回调上的内部函数可以自动传递AJAX调用响应吗?但为什么?

1 个答案:

答案 0 :(得分:1)

你不能这样做function($location){dready($location);}但你不需要因为外部作用域定义了$ location,所以回调函数将理解这个var而不试图将它传递给回调函数,所以在这个实例中

function(){dready($location);}

会奏效。

调整范围问题的另一种方法是使用$.proxy。这允许您设置将在其下调用函数的此上下文。 jQuery.proxy( dready, $location )返回一个可用作回调函数,该函数在调用时将调用方法dready并将此set设置为$ location。

e.g

$location.load($(this).attr("href").replace("index.php", "ajax.php"), '', jQuery.proxy( dready, $location );});