2014-11-05 126 views
-1

在我的項目中,我想延遲事件 - 特別是上下樓層或顯示樓層號 - 直到按下電梯的所有按鈕。例如,如果我按2,4,1,3,數字應按該順序顯示,並且向上或向下指示符應該適當突出顯示。如何延遲事件直到點擊幾個按鈕

$(document).ready(function() { 
    var $buttons = $('.buttons'), 
     $floorAnimate = $('.floor-animate'), 
     $floorPanel = $('floor-panel'); 


    function pressButtons() 
    { 
    $('.floor-number').css('display', 'none'); 
    $buttons.click(function() 
    { 
     var $floorNumber = $(this).text(), 
      floorOn = $('floor-number').text(); 

     $(this).addClass('pressed'); 
     $('.floor-number').css('display', 'block').append($floorNumber).animate({top: '-200px'}, 1500); 
     $('#up-indicator').addClass('up'); 
    }); 
    } 



pressButtons(); 
}); 
+4

我很好奇你爲什麼要延遲*事件。每次有人按下按鈕,您都應該檢查「電梯的所有按鈕是否都按下了」。一旦它們發生,你就可以觸發最後的事件(調用一個函數,觸發一個點擊事件)。我錯過了什麼嗎? – 2014-11-05 22:53:59

+1

@HarryPehkonen你是對的;這是一個[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Mathletics 2014-11-05 23:40:28

+0

@Harry我不確定是否應該延遲這些事件。這是我所能想到的如何解決問題。但所有的按鈕不需要按下。例如,用戶可以按2,4,1。或者只是1. – noob 2014-11-05 23:56:36

回答

1

看起來您需要將每個點擊事件放入數組中,並執行處理您想要的時間延遲。我做了一些粗糙的事情。

http://codepen.io/anon/pen/fJcFo

我已經添加了一些console.logs所以你可以看到在每個事件發生的事情。 但實際上發生的事情是:

  • 上單擊事件過程中,html元素文本將在「queuedFloor」投入的對象。
  • 該對象內部有兩個功能,一個是按下按鈕,另一個是在地板上。
  • 然後排隊的樓層被添加到名爲elevator.queue的數組列表中。
  • 按下的按鈕是settimeout 3秒然後調用警報告訴你你在地板上,當你在地板上時可以添加邏輯。它還調用at樓層功能,從電梯隊列中刪除對象。

如果你想要更多的靈活性與你的html對象。您可以將整個元素傳遞給queuedFloor對象:element:pressed元素 然後,當您要引用HTML元素時,可以通過其對象引用(elevator.queue [0] .element )並執行標準的JavaScript操作,例如:

elevator.queue[0].element.classList.add('onfloor'); 

這會將一個類添加到名爲「onfloor」的特定元素。

首先,我需要創建一個JavaScript對象:

var elevator = elevator || {}; 

然後我加入行動,以我的電梯對象

elevator.actions = { 
buttonPressed:function(pressedItem){ 
    console.log(pressedItem); 
    var queuedFloor = { 
    floor: pressedItem.innerText; 
    goToFloor: setTimeout(function(){ 
      alert("arrived at floor" + elevator.queue[0].floor); //do your html manipulation for item here, remember its async so have to reference it by its position in the queue. In this case we only ever call the item in position 0 of the array. 
      elevator.queue[0].atFloor(); 
    }, 3000), 
    atFloor: (function(){ 
    elevator.queue.splice(0, 1); 
     console.log('queue spliced', elevator.queue); 
    }) 

    }; 

    elevator.queue.push(queuedFloor); 
elevator.actions.moveElevator(); 
} 
moveElevator:function(){ 
    console.log('queued floors', elevator.queue); 
elevator.queue[0].goToFloor(); 
} 

}; elevator.queue = []

然後設置我點擊監聽

$buttons.click(function() 
{elevator.actions.buttonPressed(this)});  

});

+0

這很有幫助。在你的評論部分,你說我應該通過它在數組中的位置來引用它。我對這部分感到困惑。我會怎麼做?換句話說,而不是警報,我該如何連接顯示面板來顯示數字? – noob 2014-11-06 00:01:36

+0

我想我知道你的意思了: http://codepen.io/anon/pen/fJcFo – Jay 2014-11-06 00:20:11

+0

似乎沒有工作,我更喜歡你原來的解決方案,但我只是想用一些替代警報實際功能,即面板上的上/下按鈕和數字顯示。 – noob 2014-11-06 00:56:15