1. 程式人生 > >Jquery dialog( 'destroy' ) 後還有快取

Jquery dialog( 'destroy' ) 後還有快取

使用jQuery的Dialog控制元件時,jQuery會將建立的dialog快取到頁面上,生成一些隱藏的div,當再次建立dialog時,由於id相同總會呼叫快取中的Dialog,導致無法顯示想要顯示的內容。查了dialog有destroy方法,依然沒有作用。

baidu一下恍然,destroy銷燬的jquery ui給你生成dialog時候的那些html,不會銷燬元素本身,要銷燬元素本身要用remove

 <script>
        function Test()
        {
            var $dialog = $('<div></div>').dialog({
                autoOpen: true,
                title: '測試內容',
                buttons: {
                    "關閉": function () { $(this).dialog('close');},
                    "確定": function () { }
                },
                close: function () { $(this).remove(); },
                open: function ()
                {
                    $(this).html('載入你的頁面');
                }
            });
        }
    </script>

補充:上面的方法可以把Dialog徹底清除,但連同Dialog中的DIV也同時清除了,在應用中通常是自建一個Div,通過Div的id繫結Dialog,而jquery會把這個自建的div清除,內容全部放到Dialog的Div中,Dialog的Div預設是建在body中,這對於使用ajax重寫頁面程式碼的應用產生了很多衝突,如果使用上面的方法你的Dialog將只能彈出一次,關閉的時候就會被remove。查了一下替代的解決方法,可以將自建的div先clone,在close時將克隆的div重新append到頁面上。

<script>
    function Test(divId)
    {
	    var dialogParent = $(divId).parent();
	    var dialogOwn = $(divId).clone();
	    dialogOwn.hide();
		
        var $dialog = $(divId).dialog({
            autoOpen: true,
            title: '測試內容',
            buttons: {
                "關閉": function () { $(this).dialog('close');},
                "確定": function () { }
            },
            close: function () { 
            	dialogOwn.appendTo(dialogParent);
            	$(this).dialog("destroy").remove(); 
            },
            open: function ()
            {
                $(this).html('載入你的頁面');
            }
        });
    }
</script>

這是在jquery1.8中發現的問題,在其他版本中是否還有尚未測試。

實現方式還可以優化,而且網上還有一些直接改了dialog的核心的方法可以參考。