0

我在 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 秒后,我想到 function($location){dready($location);} 回调上的内部函数可能会自动通过 AJAX 调用响应?但为什么?

4

1 回答 1

1

您不能这样做,function($location){dready($location);}但您不需要这样做,因为外部范围已定义 $location 回调函数将理解此 var 而不会尝试将其传递给回调函数,因此在此实例中

function(){dready($location);}

将工作。

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

例如

$location.load($(this).attr("href").replace("index.php", "ajax.php"), '', jQuery.proxy( dready, $location );});
于 2011-05-20T10:11:11.090 回答