2014-04-14 79 views
0

我正在嘗試將onclick事件添加到特定li的某個標記,該標記在ul的編號爲#nav之下。選擇多個li,它是使用jquery的第一個孩子

HTML結構:

<ul id="nav"> 
    <li><a href="#">link1</a></li> 
    <li> 
     <a href="#">link2</a> 
     <ul> 
      <li><a href="#">innerlink1</a></li> 
      <li><a href="#">innerlink2</a></li> 
     </ul> 
    </li> 
    <li><a href="#">link3</a></li> 
    <li> 
     <a href="#">link4</a> 
     <ul> 
      <li><a href="#">innerlink1</a></li> 
      <li><a href="#">innerlink2</a></li> 
     </ul> 
    </li> 
</ul> 

jQuery的

$(document).ready(function() { 
    $("ul#nav li").eq(1).children().first().click(function(){ 
     $(this).attr('onclick', 'return false;'); 
     return false; 
    }); 
    $("ul#nav li").eq(5).children().first().click(function(){ 
     $(this).attr('onclick', 'return false;'); 
     return false; 
    }); 
}); 

如果你看到的,我寫的jQuery兩次選擇已經得到了另一個ul裏面的一個li項目的元素和onclick事件添加到它。這工作正常。但是有沒有辦法減少我的代碼並使其更加乾淨?

+2

'$(this).attr('onclick','return false;');'這種反模式在你的代碼中做了什麼?去掉它。 – undefined

+0

你是什麼意思反模式?你能解釋一下嗎?我想學習。 – user3531929

+0

我的意思是使用jQuery設置html事件屬性是一個壞主意,除了根據[關注點分離](http:// stackoverflow。問題/問題/ 98734 /什麼是分離關注)原則。在你的代碼中'return false'做你想要的,它阻止事件的默認動作並停止它的傳播。 – undefined

回答

1

所以,你不希望包含一個UL孩子,所以我認爲這會是這樣

$('#nav li:has(>ul)').click(function (event) { 
    event.preventDefault(); 
    alert('click'); 
}); 

小提琴可以發現火災click事件這裏:http://jsfiddle.net/552T4/3/

+0

非常感謝。這對我工作:) – user3531929

+0

哦,等等,我的內鏈現在不工作。我嘗試了「$('#nav li:has(> ul)')。children()。first()」,但這隻適用於第一個li。 – user3531929

+0

好吧,如果我錯了,請糾正我,但是您是否想要停止「li」元素或「a」元素上的點擊事件?如果是「a」元素,則修改小提琴:http://jsfiddle.net/552T4/6/ – Johann

0

嘿,你可能會尋找這樣的:

$("ul#nav li:has(>ul)") 
+0

喜歡這個。但與第一種解決方案相同。它正在爲第一個李的標籤工作。 – user3531929

0
$("ul#nav li:eq(1),ul#nav li:eq(5)").children().click(function(){ 
    e.preventDefault(); 
    var youClicked=$(this).text(); 
    alert(youClicked); 

}); 
+0

感謝您的解決方案。但是這隻返回第一個鏈接。 – user3531929

+0

確定刪除.first()....我已更新@ user3531929 – Tuhin

+0

實際上您的要求不明確... – Tuhin

-1

是的,添加的ID到您需要的元素:

HTML結構:

<ul id="nav"> 
    <li><a href="#">link1</a></li> 
    <li> 
     <a href="#" id="liOne">link2</a> 
     <ul> 
      <li>innerlink1</li> 
      <li>innerlink2</li> 
     </ul> 
    </li> 
    <li><a href="#">link3</a></li> 
    <li> 
     <a href="#" id="liTwo">link4</a> 
     <ul> 
      <li>innerlink1</li> 
      <li>innerlink2</li> 
     </ul> 
    </li> 
</ul> 

jQuery的

$("#liOne, #liTwo").click(function(e){ 
    e.preventDefault(); 
    return false; 
}); 

甚至一個班級,而不是id的。

這樣,您只需將id/class屬性添加到要處理的點擊事件的元素上,而不是像那樣遍歷DOM。

+0

感謝您的解決方案。不幸的是我不能添加id,因爲li來自循環。 – user3531929

+1

@ user3531929:啊,那真是太遺憾了:P 另外,請問這個答案的人是否可以解釋一下爲什麼?如果我犯了一個錯誤,我想從中吸取教訓。 雖然這可能不是OP的解決方案,但它適用於用戶有能力影響HTML結構化的用例。 – Cerbrus

0

請試試這個。

$(document).ready(function() { 
    $("#nav > li").each(function(){ 
     $(this).find('a').attr('onclick', 'return false;'); 
    });  
}); 

下面是這個的小提琴。

Js Fiddle

在上面我申請 「的onclick」 事件到所有的錨。如果你只想應用那個有孩子的李,那麼代碼就是這樣的。

$(document).ready(function() { 
    $("#nav > li").each(function(){ 
     if($(this).find('ul').length>0) 
     { 
      $(this).find('a').attr('onclick', 'return false;'); 
     } 
    });  
}); 

下面是LI與UI元素選擇的鏈接。

li with ul onclick

+0

現在,您正在將'onclick'應用於_all_'#nav> li a''元素。這就是所有的錨點,而不僅僅是OP想要的錨點。 – Cerbrus

+0

@Cerbrus是的,我申請了所有的主播。如果你只想要第一個,那麼也可以通過第一個來完成。我更新我的答案,請檢查它。 –

+0

@Cerbrus你爲什麼低估我的回答? –

相關問題