簡體   English   中英

$(document).ready等效於異步加載的內容

[英]$(document).ready equivalent in asynchronously loaded content

我有一個UI(讓我們稱之為第1頁 ),其中包含大量的HTML和JavaScript。 當單擊第1頁上的某些元素時,會打開一個jQuery UI對話框並加載一個部分頁面(讓我們調用該頁面2 ):

$("#myDialog").dialog({ modal: true /* Other options */ });
$('#myDialog').load('page2Link', { }, function () { });
$('#myDialog').dialog('open');

然后,它還有一堆HTML和JavaScript。 簡化示例:

<script src="Scripts/page2Stuff.js" type="text/javascript"></script>

<div id="page2Body">
    <!-- More elements -->
</div>

我在page2Stuff.js中有JS需要等到第2頁完全呈現。 我可以在這個部分頁面中使用什么來查看是否已將新HTML添加到DOM中? 我嘗試過以下方法:

$('#myDialog').load('page2Link', { }, page2ReadyFunction);

這找不到page2ReadyFunction 我想是因為.load運行的JavaScript page2Stuff.js ,然后將其丟棄或東西嗎?

我能夠讓它工作的方式現在它使用setTimeout並不斷檢查$('#page2Body')返回任何東西,但這似乎並不理想。

不要在第二頁的開頭添加script標記,而是在所有HTML之后將其放在最后,如下所示:

<div id="page2Body">
    <!-- More elements -->
</div>

<script src="Scripts/page2Stuff.js" type="text/javascript"></script>

由於代碼將根據源順序執行,因此您可以放心,在腳本運行時HTML將准備就緒。

當您運行load函數時,期望page2ReadyFunction在該確切時間存在。 它不是因為你沒有加載腳本。 以下將解決該問題,但也不應該工作,因為腳本將異步加載:

$('#myDialog').load('page2Link', { }, function() {page2ReadyFunction();});

要解決這個問題,你可以這樣做:

$('#myDialog').load('page2Link', { }, function() {
    function tryPageLoad() {
        if(page2ReadyFunction)
            page2ReadyFunction();
        else
            setTimeout(tryPageLoad, 100);
    }
    tryPageLoad();
});

此函數每隔100ms嘗試查看page2ReadyFunction存在,並在此時調用它。

當然,您不必擔心這一點,因為子腳本標記將異步加載,並且渲染應該在JavaScript執行之前發生。 您可以使用console.log來驗證這一點,以查看首先觸發的內容,客戶端腳本中的JavaScript或回調函數。

來自jQuery文檔的加載回調函數: http//api.jquery.com/load/

complete(responseText,textStatus,XMLHttpRequest)請求完成時執行的回調函數。

此函數在請求完成時執行,但您需要等到呈現第2頁。

一個簡單的解決方案是將$(document).ready()塊放入page2提取的javascript文件中。

如果你想在完成ajax加載后加載一些東西,請

你得用它

這樣的完整ajax功能

var req= $.ajax({
            url:'page2Link',
            type:"post",
            data:{ajax:1,field_id:field_ids,whatever:whatever}

        }); 
        //after loading
        req.complete(function(res){
            $('#myDialog').html(res);
        });
        //after complete loading and request end
        req.always(function(res){
            page2ReadyFunction
        });

所有這一切,而不是

$('#myDialog').load('page2Link', { }, function () { });

像這樣服務:

<script src="Scripts/page2Stuff.js" type="text/javascript"></script>

<div id="page2Body">
    <!-- More elements -->
</div>

<script>
$(function() {
    // call your function from page2Stuff.js here
});
</script>

你能用這樣的東西:

<body onload="function2kickOffP2()">

這將繼續在page2的主體上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM