2013-12-10 27 views
0

我有一組兩個div - 第一組:當人們將鼠標移到這些div上時,它會觸發一個事件,第二組:當事件被觸發時,這些div將被顯示。 當您將鼠標放在第一組中的div上時,它應該在第二組中顯示其對應的div。我認爲一個簡單的方法來匹配鼠標懸停div與正確的div顯示將使用數組。我已經能夠正確地附加事件監聽器,但我無法弄清楚如何設置它,以便當您將鼠標懸停在數組的一個對象上時,它將顯示具有相同索引編號的數組對象。我認爲,如果我能弄清楚如何識別我所關注的對象的索引號,那麼我就可以實現它的工作。我已經嘗試了很多東西,但一直未能創造出任何有效的東西。下面的代碼:如何在JavaScript中使用數組來匹配事件觸發時的div?

<script> 
$(document).ready(function(){ 


//create array of divs to mouse over 
var ar = new Array(); 
ar[0] = $("#home"); 
ar[1] = $("#doc"); 

var length = ar.length; 

//create array of divs to display when event is fired 
var des = new Array(); 
des[0] = $("#homeDes"); 
des[1] = $("#docDes"); 


// start for 
for (var i = 0; i< length; ++i) 
{ 
ar[i].bind("mouseover",function(){$(des[i]).css("display","block");}); 
ar[i].bind("mouseout",function(){$(des[i]).css("display","none");}); 
} 
//end for 

}); 
//end 

</script> 
+0

而不是做這些你可以把數據屬性放到你的源元素來指定目標元素選擇器,而不是循環遍歷,指定一個類到你的源並綁定事件給它們。你的html是怎樣的? – PSL

回答

1
$(document).ready(function(){ 


    //create array of divs to mouse over 
    var ar = new Array(); 
    ar[0] = $("#home"); 
    ar[1] = $("#doc"); 

    var length = ar.length; 

    //create array of divs to display when event is fired 
    var des = new Array(); 
    des[0] = $("#homeDes"); 
    des[1] = $("#docDes"); 


    // start for 
    for (var i = 0; i< length; ++i) 
    { 
     // WRAP THE BODY OF THE FOR LOOP IN A FUNCTION 
     function(index) { 
      ar[index].bind("mouseover",function() { 
       $(des[index]).css("display","block");} 
      ); 
      ar[index].bind("mouseout",function() { 
       $(des[index]).css("display","none"); 
      }); 
     }(i); 
    } 
    //end for 

}); 

當事件被觸發的i值是數組的長度,你要的i值傳遞給另一個函數,以便在每個功能範圍的值index將被調用時的值爲i

+0

當然,這是一個經典的綁定問題,'我'在循環過程中被更改,必須確保循環中的每個函數都不會綁定到'i',而是綁定時'i'的值。另一種方法是使用Function.bind。 – GameAlchemist

1

我傾向於對此做出更靈活的方法,以便在更改HTML時不需要更改JavaScript。考慮對需要綁定和提供數據屬性的元素進行分類以指定目標。您的div的HTML是綁定可能是這樣的:

<div id="home" class="mouseoverToggleTrigger" data-target="#homeDes">...</div> 

而jQuery的可能是這樣的:

$(document).ready(function(){ 

    $('.mouseoverToggleTrigger').hover(function() { 
     var $target = $($(this).data('target')); 
     $target.toggle(); 
    } 
}); 

注意這是假設你使用HTML5針對jQuery的,默認情況下,轉換data-*轉化爲可通過data()獲取的值。

對於不屬於HTML5,這個頁面更廣義的解決方案將工作

$(document).ready(function(){ 

    $('.mouseoverToggleTrigger').hover(function() { 
     var $target = $($(this).prop('data-target')); 
     $target.toggle(); 
    } 
}); 

的靈活性,這給了一個額外位,是,你現在不必自己限制在一個對一觸發到目標映射。您可以指定一個類名或其他jQuery選擇器來獲取高度自定義的行爲,例如一個觸發器切換某個類的所有元素,這些元素是另一個類的子元素。

+0

html5不重要...可以在IE6和7中使用'data-'和jQuery.data() – charlietfl

+0

@charlietfl有趣的。感謝您的注意。 jQuery文檔僅注意對HTML5方面的數據屬性的支持。不確定在不使用HTML5時,這種行爲在不同瀏覽器中的可靠程度如何。 –

+0

他們稱它們爲'html5屬性',但只要jQuery已經存在,但只是使用任意屬性,概念已經被使用,並不通過W3C驗證,但仍然可行。然後,當引入data()時,它將匹配到data-' – charlietfl

0

更簡單的方法代碼明智是給予共同的元件共同類,然後使用jQuery index()eq()匹配配對

HTML

<a id="home" class="hoverMe"> 
<a id="doc" class="hoverMe"> 

<div id="homeDes" class="content"> 
<div id="docDes" class="content"> 

JS

var $content=$('.content') 
var $links=$('.hoverMe').hover(function(){ 
    $content.eq($links.index(this)).show() 

},function(){ 
    $content.eq($links.index(this)).hide() 
}) 

eq() API Docs

+0

這假定觸發器和目標div以相同的相對順序出現在頁面上。因此,這是一個非常脆弱的方法。 –

+0

@MikeBrant賠率通常很好地支持它們以相同的順序呈現。 OP會很快發現這種方法是行不通的...... howveer也會從中學到一些東西 – charlietfl

+0

@charliefti也許吧。也許不會。我們不知道OP源代碼是什麼。剛剛發現需要注意的是,該解決方案在很大程度上依賴於在DOM上呈現元素的順序。 –

相關問題