2016-12-12 43 views
0

我旁邊HTML結構:如何檢測DOM準備和所有屬性設置

<div id="controls">  
    <div class="action" data-action="controller/action1" data-view="view1">...</div> 
    <div class="action" data-action="controller/action1" data-view="view2">...</div> 
    <div class="action" data-action="controller/action2" data-view="view1">...</div> 
    <div class="action" data-action="controller/action2" data-view="view2">...</div> 
    ...e.t.c. 
</div> 

在打字稿我試圖讓數據的屬性和構建Ajax查詢:

$('#controls').off('click').on('click','.action',(e) => { 
     var $element = $(e.target), 
      action = $element.data('action'), 
      view = $element.data('view'); 

     if(!action) 
      return this.sendNotification(false,'Setup action in config'); 
     if(!view) 
      return this.sendNotification(false,'Setup view in config'); 

     // Ajax request and other logic 
}); 

我也有功能頁面的那部分更新(包括話題開始的div塊)

private updateActionsBlock() { 
    $.get(location.href, (html) => { 
     $('#controls').html($(html).find('#controls')); 
      this.init(); 
    }); 
} 

PR OBLEM

如果用戶與互聯網連接或慢電腦出了問題(可能是瀏覽器有沒有足夠的RAM) - 使用updateActionBlock()$('.action')幾秒鐘不可能得到的數據屬性之後。這些變得不確定。

問題

我怎麼能禁用前DOM準備點擊$('.action');

我希望它是可以做到不setTimeout

+0

要麼在document.ready激發之後運行'updateActionsBlock()',要麼隱藏這些元素並將它們淡入到document.ready中。我不明白這實際上是你的問題,因爲委託事件應該在AJAX請求完成之前綁定* long * –

+0

不幸的是,在每個由'.action'點擊處理的ajax請求之後,我需要使用'updateActionBlock'。 'document.ready','document.DOMContentLoaded'只能在頁面初始化中使用 –

+0

好的,但我的意思是委託的事件處理程序已經綁定了,所以沒有事件被觸發的情況下單元可以被點擊。 –

回答

0

的問題在DOM沒有。

$('#controls').off('click').on('click','.action',(e) => { 
     var $element = $(e.target), 
      action = $element.data('action'), 
      view = $element.data('view'); 

     if(!action) 
      return this.sendNotification(false,'Setup action in config'); 
     if(!view) 
      return this.sendNotification(false,'Setup view in config'); 

     // Ajax request and other logic 
}); 

有些時候,當我在.action點擊我e.target了錯誤的元素。而不是<div class='action'>...</div>我獲得了內部元素。

所以當我將e.target更改爲e.currentTarget修正了一個錯誤。