2012-10-12 52 views
-1

我想有一個觸發間隔DOM元素被初始化,像這樣一次事件:如何在每次在jQuery中加載元素時調用.ready?

HTML

<div id="container"> 
    <div id="data">data!</div> 
</div> 

<div id="clickme">Click me!</div>​ 

的Javascript

$(function() { 
    var i = 0; 
    $('#clickme').click(function() { 
     $('#container').html('<div id="data">data '+i+'</div>'); 
     i++; 
    }); 

    // this event gets called only the first time #data element is ready 
    // I want it to be called each time #data comes into being 
    $('#data').ready(function() { 
     alert('element data ready!'); 
    }); 
}); 

我試過了:

// doesn't work 
$('#data').live('ready', function() { 
    alert('element data ready (live)'); 
}); 

編輯:我有興趣做,對於由AJAX插入的元素。例如:

$.post('/myaction/', { 
    param: 'value' 
    }, 
    function(data) { 
     $('#someContainer').replaceWith(data); 
    }); 

    // this function operates on elements returned by the ajax call, so they are not available at this point. 
    myFunction(); 

    // so I'd better call myFunction() when the ajax data is inserted 
}); 

小提琴這裏:http://jsfiddle.net/nf8CP/

+4

爲什麼你會需要一個事件?爲什麼不在創建元素時調用代碼? –

+1

元素初始化是什麼意思? –

+1

我認爲「就緒」是當window.onload啓動,並document.readyState ==「完整」..並且只發生一次! – 2012-10-12 16:17:43

回答

2

爲您更新的問題,只要將你的函數回調,就大功告成了。

$.post('/myaction/', { 
    param: 'value' 
    }, 
    function(data) { 
     $('#someContainer').replaceWith(data); 

     myFunction(); // Call it right here. 
    }); 

// myFunction(); // Not here!!! 

}); 

有DOM突變事件,但我相信他們是過時了,沒有完全瀏覽器的支持。

還有livequery插件,但它確實是過度殺毒。

.ready()處理程序不處理單個元素的加載事件。僅適用於DOM加載的事件。這三個例子都具有相同的行爲:

  • $(document).ready(...
  • $('document').ready(...
  • $("#data").ready(...
  • $().ready(...

沒有區別。傳遞給$的參數將被忽略。

正確的解決方案是在創建元素時調用所需的代碼。

$(function() { 
    var i = 0; 
    $('#clickme').click(function() { 
     $('#container').html('<div id="data">data '+i+'</div>'); 
     dataReady(); 
     i++; 
    }); 

    function dataReady() { 
     alert('element data ready!'); 
    } 
}); 

此外,由於你的榜樣,更好的和破壞性更小的解決方案是簡單地修改文本在#data,而不是與.html()破壞的元素。

+0

這個例子是模擬一個新的元素被加載來觸發.ready函數(我有興趣去捕捉事件,而不是改變元素文本) –

+2

@pinouchon:我明白了,我的觀點是,如果你是加載元素的人,你應該在創建它們時運行代碼,而不是希望獲得一個事件系統*(當然,除非你不控制修改DOM的代碼)。*沒有完全的跨瀏覽器事件來處理這個事件。 –

+0

@pinouchon:其實,我給了兩個解決方案是關於主題的。 DOM突變事件和'livequery'插件。也不建議。 '.ready()'方法只做一件事。它在DOM準備好時調用處理程序。它不針對個別元素。你可能會認爲它的確如此,因爲它在你操作'$(「#data」)。ready(...',但實際上忽略了「#data」部分。 –

1

ready(或更確切地說DOMContentLoaded)只在頁面被完全解析時觸發一次。有沒有乾淨的方式來做你想在這裏,所以你需要去手動安裝你的事件處理程序。 (有DOM突變事件,但這些事件非常嘈雜,你的頁面會自己嘗試處理它們,除非你真的知道你在做什麼,否則這通常是一個壞主意)。

但是,我懷疑你真正想要的是事件代表團。您需要在#container上安裝事件而不是#data,因爲當您調用ready函數時,現有的#data節點將從DOM中刪除!

例如:

$('#container').on('click', '#data', function() { 
    alert('#data element was clicked!'); 
}); 

這樣做是對#container安裝一個處理器(從不改變),一個偵聽click事件發起(或鼓泡通過)一個子元素與選擇#data。這意味着即使您不斷更換#container的內容,也不必在其內容上安裝新的事件處理程序。

0

您可以使用DOMNodeInserted

$(document).on('DOMNodeInserted', function() { 
    alert('element data ready (live)'); 
}); 

每當一個節點被添加到DOM將被解僱。

您還可以過濾觸發什麼節點這一事件像這樣:

$(document).on('DOMNodeInserted', '#data', function() { 
    ... 
} 

現在加入的data的ID節點時,它只會引發。

+0

-1不提及瀏覽器這個解決方案不兼容,而且把處理器放在'document'而不是''#container''上。 –

0

你爲什麼不把你的。就緒您點擊按鈕裏面,所以你可以看到,如果它已經準備好你點擊它每次:

$(function() { 
    var i = 0; 
    $('#clickme').click(function() { 
     $('#container').html('<div id="data">data ' + i + '</div>'); 
     i++; 
     $('#data').ready(function() { 
      alert('element data ready!'); 
     }); 
    }); 
});​ 
+1

你爲什麼要用'。ready()'系統而不是直接調用代碼? '.ready()'在這裏什麼都不加。 –

+0

這是提問者想要的。檢查#數據是否準備就緒。 –

+0

但'.ready()'不這樣做。 '.ready()'只檢查DOM是否準備就緒。它忽略了選擇器。無論如何,沒有必要進行「準備」檢查。要執行的代碼行*在* .html(「...」)調用之後,顯然元素將準備就緒。 –

相關問題