2012-08-08 79 views
3

我對javascript比較新,所以請對它反對。在javascript中執行順序的問題

我有一點代碼,應該給用戶一點時間從基本菜單到達子菜單。 我的問題是,代碼以奇怪的順序繼續執行。

下面是代碼:

function onFocusOut() { 
    var tester = 0; 
    setTimeout(function(){menuReset(tester)},1000); 
} 

function menuReset(tester) {  
    var hoverCheck = function (event) { 
     alert("#navBase a has focus"); //is fired, but to late... 
     var tester = event.data.varTester; 
     var tester = 1; 
    }; 

    jQuery('#navBase').on('mousemove', 'a', { varTester: tester }, hoverCheck); 
    jQuery('#navBase').off('mousemove', 'a', { varTester: tester }, hoverCheck); 

    alert(tester); //This keeps firing first, before the alert in hoverCheck 

    if(tester == 1){ 
     alert("tester = 1"); 
     return; 
    } 

    else { 
     jQuery('#navBase ul').hide(); 
     jQuery('#navBase').css({'width': ''}); 
     jQuery('#navBaseAnchor').css({ 
      'width': '', 'color': '', 
      'font-size': '', 
      'border-bottom-style': '', 
      'border-bottom-width': '', 
      'border-bottom-color': ''}); 

     tester = 0; 
    } 
} 

現在我不斷收到警告說,「測試」爲0,則執行hoverCheck功能之前(這應該設置「測試」爲1),並觸發內警報該功能。

有人能告訴我我做錯了什麼嗎?

回答

0

alert(tester)是正在執行您注意到的用戶身份的第一行代碼。這兩個函數調用jQuery().on()jQuery().off()僅附加事件處理程序。如果您希望在警報中看到「1」,則必須在執行hoverCheck之前快速移動鼠標。但是可能你的手不能比JavaScript到達下一行更快,這是alert(),tester等於「0」。

+0

啊哈,謝謝。男人我已經在這個好幾天了,這其實是一個市長的退縮......你知道另一種方法來檢查一個元素當前是否被盤旋嗎? (特別是在整個子菜單亂七八糟的時候) – Marcelcolt 2012-08-08 08:38:36

+0

嗯...我的意思是放棄當然。我嘗試過從mouseenter,mouseover,mousemove到mousein。而且我知道這不是重點... – Marcelcolt 2012-08-08 09:10:42

1

我對JS也很新,但是你也應該留意可變範圍錯誤嗎?

您已經在onFocusOut()menuReset(tester)的本地聲明瞭tester,然後將其稱爲外部全局變量?

answers.oreilly.com

  • LOCAL - 是那些特定的功能,只有在它的工作。
  • GLOBAL - 那些未在函數中定義的函數,也可用於函數,除非函數不需要變量 。
+1

我實際上首先在全局調用它,但由於它沒有傳遞給hoverCheck(),我也在本地傳遞它。 – Marcelcolt 2012-08-08 08:29:36

1

沒關係的人...... 我發現周圍所有的方式。 目前,我將.focus()設置爲涉及mouseOver的錨點。 (當然blur()mouseleave) 然後真的很容易使用document.activeElement檢查當前被聚焦的元素。

所以問題解決了,儘管有點不同。

-1

有點不同的方法是設置一個Javascript超時(),如果某個條件不滿足,使子菜單在一段時間後消失。

退房this JSFiddle example

祝您好運!

+1

你可能會也可能沒有檢查出我上面的初始代碼,但這正是我所做的。問題是你提到的條件應該是「懸停」。事情是,JavaScript無法檢測到一個元素是否在現在** **。在爲懸停部分解決問題之後,我仍然使用超時。 – Marcelcolt 2012-08-12 11:24:18