2012-12-03 182 views
8

我想使網站頁面滑動到另一個。所以我做了$('a')。click();函數檢查鏈接是否是本地的,如果它獲取鏈接href並將其加載到主體。jQuery .load()等待,直到內容加載

$('a').click(function(){ 
    var href=$(this).attr('href'); 
    $('body').load(href); 
    return false; 
}); 

它看起來不錯,但我的網站也有很多js插件包括在內。執行它們需要一段時間,並且.load動作首先顯示'js'內容不變,然後執行js。它會導致內容不好的flickr。

是否有可能使用JS的所有exectuion緩存新內容,直到完成後才更改舊的內容,以及何時全部DOM和JS完成了新內容,slideOut舊內容和slideIn新內容?

編輯:我認爲重點不在於檢測js執行,而在於檢查是否所有其他文件都已加載 - 應該在新文件的$(window).load同時觸發DOM更改。

[編輯] ------------------------------------------ ----------------------------

我的解決方案是css代碼(css始終在dom編譯之前加載)具有跨瀏覽器的不透明度爲0

.transparent{ 
    -moz-opacity: 0.00; 
    opacity: 0.00; 
    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha"(Opacity=0); 
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); 
    filter:alpha(opacity=0); 
} 

而且它的內容不好的Flickr通常但並不總是阻止。現在可以檢測到jQuery ajax加載的內容,並應用一些顯示超時等等。但實際上問題仍然存在。

要現在做多一點簡單的例子,對於這個問題:點擊該鏈接後

如何開始$後更改DOM(「主體」)的負載(「something.php」)3000ms火.load ('something.php')函數? (點擊後應立即啓動加載,但DOM更改必須稍後啓動)

+0

負載有等待AJAX​​請求完成回調,您可以使用,而這一切都在[** **文檔](http://api.jquery.com/load/),如果你的插件有類似的回調,你也可以使用它們,否則超時可能是最簡單的解決方案。 – adeneo

回答

0

.load函數提供第二個參數,該參數是在操作完成時要調用的函數。實際上,您可以使用它來同步所有依賴或必須等待ajax調用完成的操作。事情是這樣的:

$("body").load(href, function(responseData){ 
    // whatever you need to do when the ajax call is complete 
}) 

編輯: 作爲,adeneo在評論中指出,退房the documentation

+0

我知道。我需要做的事情是告訴jQuery - 不要在完成調用之前觸摸實際的內容!所以完整的回調不會幫助我。 – user1785870

+0

@ user1785870我真的不明白。你是說你想阻止.load函數做任何事情,直到所有的頁面內容已經加載,或類似的東西?換句話說,頁面加載,但鏈接不會做任何事情,直到一切完成加載和執行,然後用戶被允許點擊鏈接? –

+1

想象一下,你的頁面上會有一個$('body')的鏈接,load('something.php');當你點擊鏈接直到something.php中的內容完全加載時,我不希望發生任何事情。如果something.php有很多大的圖片,點擊一段時間後就不會發生任何事情。 – user1785870

0

有一兩件事可以幫助是把你的HTML 一些腳本標籤中使用用戶定義類型 (或加載腳本標籤中的HTML)

這樣的:

<script type="text/template" id="myTemplate"> 
    <div>some html</div> 
</script> 

的HTML代碼中不會受到大教堂,直到你把它添加到頁面

//... at some point 
var tmp = $('#myTemplate').html(); 
$(body).append(tmp); 

AJOS理解!

0

請勿使用.load()。該方法特別針對你想要避免的情況。

嘗試這樣做:

  1. 負載與$不用彷徨,.post的$,$就或任何方法適合你。這樣,您就可以將HTML代碼與腳本一起作爲HTML字符串獲取。
  2. 創建一個隱藏div或透明div或其他元素來放入內容。這裏的技巧是確保在執行腳本之前不會顯示該div。要做到這一點,唯一的方法就是在每個要加載的頁面中添加一個最後一個腳本,並使用一個刪除舊內容並顯示新內容的函數。作爲最後一個腳本,直到其他腳本纔會執行,因此您的DOM應該已準備就緒。

當然,如果你的腳本依賴於類似$(document).ready()的東西,這將不起作用,因爲這將立即執行。圖像也有同樣的問題。它們是異步加載的,所以你不會知道它們什麼時候被加載,除非你把一個處理程序附加到每個圖像的onload事件上,這不是一個好主意。

1

也許你應該使用的承諾和嘗試是這樣的:

$('a').click(function(){ 
    var href=$(this).attr('href'); 
    $('body').hide(); 
    $('body').load(href, function() { 
     $('body').show(); 
    }); 
}); 
相關問題