2011-05-20 186 views
0

我一直在JS編碼一段時間,但不知何故,我總是得到一個'刮頭'類型的問題。我認爲我需要進行一些挖掘,但同時有人可以幫助解決這個問題?load()API調用函數回調範圍

所以,這裏是問題: 我正在通過該項(通過$(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秒後我張貼了這個它發生,我認爲函數($位置){DREADY($位置);}在回調可能會自動地通過AJAX調用響應內部功能?但爲什麼?

回答

1

你不能做到這一點function($location){dready($location);}但你並不需要,因爲外部範圍有$位置定義的回調FUNC就會明白這個變量var而不用試圖將其傳遞到回調funcion所以在這種情況下

function(){dready($location);}

將工作。

混淆範圍界定問題的另一種方法是使用$.proxy。這允許您設置該函數將在其下調用的上下文。 jQuery.proxy(dready, $location)返回一個函數,該函數可以用作回調函數,當調用該函數時,將調用方法dready並將此設置爲$ location。

e.g

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