2014-02-28 35 views
2

我很抱歉如果這是一個重複的問題,但我無法找到答案。沒有一個例子,我無法找到解決問題的方法。 想象一下,我有幾百行的表。現在,在每行中我有一個選擇框:更改表格行內的屬性

<select id="task_stat" name="task[stat]" style="display: none;"></select> 

選項是不是一個問題,現在(我在我的實際文件數)。現在所有這些選擇框都有相同的id字段。我想知道如何改變只有一個選擇框的顯示,當它是相應的<tr>被點擊。我有以下幾種:

$("#myTableId tr").click(function() { 
    $("select #task_stat").css("display"),"block"); 
}); 

當然還有$(document).ready的功能。但是,這將顯示所有選擇框(按預期),而不僅僅是一個。有沒有辦法只顯示點擊表格行上的選擇框? (我真的很喜歡它,如果可以點擊<td>,但我不認爲<td>支持.click

+3

你不應該有相同'id'元素。元素可以共享相同的'class',但'id's需要始終是唯一的。 –

+0

由rails生成,我真的不明白爲什麼他們在他們的框架中允許這樣的錯誤。 – Arijoon

回答

2

首先,你不能有重複的id領域,使用類來代替。其次,你應該能夠改變你的函數這樣的事情,引用被點擊的tr的子元素:

$("#myTableId tr").click(function() { 
    $(this).children("select .task_stat").css("display","block"); 
}); 

這會假設你改變了你的標記是這樣的:

<select class="task_stat" name="task[stat]" style="display: none;"></select> 

編輯

如在下面的評論中提到,這很可能是嵌套超出tr的直系後裔,所以使用find()而不是children()會比較合適:

$("#myTableId tr").click(function() { 
    $(this).find("select .task_stat").css("display","block"); 
}); 
+1

如果您選擇的元素不是''的直接後代,則使用'.find()'而不是'.children()'。 – pschueller

+0

是的,好點。 – Goose

+0

非常感謝你的回答。我必須擁有相同的ID,因爲它是由rails'form_for'生成的。我將尋找一種使用rails分配類的方法。 – Arijoon

1

ID的應始終獨一無二。這是他們背後的關鍵。如果您有多個元素,請在需要鉤子時嘗試使用類名。

如果這些輸入是通過循環或其他方式生成服務器端,請查看是否可以將循環迭代器或其他東西附加到id。例如,「mySelect1」。

Check out this jsFiddle它應該讓你朝着正確的方向前進。

東西沿着這些線路是你需要的JavaScript:

$('table td').on('click', function (event) { 
    $(this).closest('tr').find('select').css('display', 'block'); 
}); 
+0

Dude你是一個傳奇人物。這正是我想要的一點改變。我已經接受了另一個答案,但這很好。我從服務器分配了一個類給我的元素,但沒有更改它們的ID,因爲rails使用該ID將它們保存到數據庫中 – Arijoon

+0

非常歡迎。我很高興它有幫助! – Damon