2014-07-18 21 views
0

當處理涉及鼠標的X,Y位置或任何不斷更新的數據的事件時,在T週期中僅對特定情況做出一次反應的模式?僅對連續流作出一次反應的模式

例如,如果我正在通過accept選項收聽droppable hander,accept函數將不斷執行以檢查可丟棄性,但是如何才能在T期內僅向用戶彈出我的消息而不會轟擊我彈出消息的屏幕?

$scope.layoutDropOptions = { 
    hoverClass: 'ui-state-highlight', 
    multiple: true, 
    tolerance: 'pointer', 
    accept: function (elem) { 
     var isAField = $(elem).hasClass("field"); 
     var isFromSideBar = $(elem).parent().hasClass("fields"); 
     var onTheSame = $(this).find('#' + $(elem).attr("id")).size() != 0; 
     var alreadyExists = $('.layoutContainer').find('#' + $(elem).attr("id")).size() != 0; 

     if (alreadyExists && isFromSideBar) { 
      // need to pop only once: 
      //toaster.pop('warning', 
      // UserMessages.formBuilder.duplicateField.title, 
      // UserMessages.formBuilder.duplicateField.body); 
      return false; 
     } 
     return isAField && !onTheSame ? true : false; 
    } 
} 
+0

is this angular? –

+0

是的,但並不認爲這與問題太相關,所以沒有標記。我一般都想知道人們如何處理這種情況。但是,這是一個指令控制器不是視圖控制器 – XGreen

+2

谷歌條款'JavaScript油門'或'JavaScript反彈' – charlietfl

回答

0

我現在正在這樣做,但我想也許有人可以想出更好的方法並獲得積分?

var lastCall = 0; 

$scope.layoutDropOptions = { 
    hoverClass: 'ui-state-highlight', 
    multiple: true, 
    tolerance: 'pointer', 
    accept: function (elem) { 
     var isAField = $(elem).hasClass("field"); 
     var isFromSideBar = $(elem).parent().hasClass("fields"); 
     var onTheSame = $(this).find('#' + $(elem).attr("id")).size() != 0; 
     var alreadyExists = $('.layoutContainer').find('#' + $(elem).attr("id")).size() != 0; 

     if (alreadyExists && isFromSideBar) { 

      if (new Date() - lastCall > 1000) { 
       lastCall = new Date(); 
       toaster.pop('warning', 
        UserMessages.formBuilder.duplicateField.title, 
        UserMessages.formBuilder.duplicateField.body); 
      } 
      return false; 
     } 
     return isAField && !onTheSame ? true : false; 
    } 
}