2011-08-24 59 views
17

Hãy tha thứ cho tôi nếu tôi lặp lại câu hỏi.Cách đơn giản để lấy phần tử theo id trong thẻ div?

Tôi có HTML rằng tất cả các phần tử bên trong thẻ div có id khác nhau, giả sử tôi đã có tham chiếu đến div, có cách nào đơn giản để lấy phần tử theo id của nó mà không lặp lại tất cả các phần tử với div đó không?

đây là html mẫu của tôi:

<div id="div1" > 
    <input type="text" id="edit1" /> 
    <input type="text" id="edit2" /> 
</div> 
<div id="div2" > 
    <input type="text" id="edit1" /> 
    <input type="text" id="edit2" /> 
</div> 
+3

Bạn không thể có nhiều hơn một phần tử với id cùng trong cây DOM toàn ... 'id' phải là duy nhất, luôn luôn. –

+3

xin vui lòng không sử dụng này. đây là đánh dấu không hợp lệ. – naveen

+0

Khi câu trả lời @PaulPROs cho biết, bạn không có HTML. Bạn có một cái gì đó * giống * HTML, nhưng vì bạn có nhiều phần tử với cùng một 'id', nó không hợp lệ. –

Trả lời

41

Bạn có thể thử một cái gì đó như thế này.

Đánh dấu mẫu.

<div id="div1" > 
    <input type="text" id="edit1" /> 
    <input type="text" id="edit2" /> 
</div> 
<div id="div2" > 
    <input type="text" id="edit3" /> 
    <input type="text" id="edit4" /> 
</div> 

Javascript

function GetElementInsideContainer(containerID, childID) { 
    var elm = {}; 
    var elms = document.getElementById(containerID).getElementsByTagName("*"); 
    for (var i = 0; i < elms.length; i++) { 
     if (elms[i].id === childID) { 
      elm = elms[i]; 
      break; 
     } 
    } 
    return elm; 
} 

Demo: http://jsfiddle.net/naveen/H8j2A/

Một phương pháp tốt hơn theo đề nghị của nnnnnn

function GetElementInsideContainer(containerID, childID) { 
    var elm = document.getElementById(childID); 
    var parent = elm ? elm.parentNode : {}; 
    return (parent.id && parent.id === containerID) ? elm : {}; 
} 

Demo: http://jsfiddle.net/naveen/4JMgF/

Gọi nó như

var e = GetElementInsideContainer("div1", "edit1"); 
+0

cảm ơn mã của bạn. Dường như iterate là cách duy nhất, phải không? – eric2323223

+0

bạn có thích sử dụng lớp thay vì id không? – naveen

+3

Vòng lặp này có vẻ hơi vô nghĩa khi bạn đã thay đổi đánh dấu để giữ ID duy nhất. Nếu bạn đã biết ID của phần tử con tại sao bạn không chỉ nhận nó trực tiếp bằng cách sử dụng 'getElementById()'? Nếu ý tưởng là để chỉ trả lại nó nếu nó là một đứa trẻ của một div cụ thể bạn vẫn có thể bắt đầu bằng cách nhận đứa trẻ và sau đó kiểm tra cha mẹ của nó. – nnnnnn

9

Bạn không muốn làm điều này. Đây là HTML không hợp lệ để có nhiều phần tử với cùng một số id. Trình duyệt sẽ không xử lý tốt, và bạn sẽ có hành vi không xác định, nghĩa là bạn không biết trình duyệt sẽ cung cấp cho bạn gì khi bạn chọn một phần tử theo id đó, nó có thể không thể đoán trước được.

Bạn nên sử dụng một lớp học hoặc chỉ lặp lại thông qua các yếu tố đầu vào và theo dõi chỉ mục.

Hãy thử một cái gì đó như thế này:

var div2 = document.getElementById('div2'); 
for(i = j = 0; i < div2.childNodes.length; i++) 
    if(div2.childNodes[i].nodeName == 'INPUT'){ 
     j++; 
     var input = div2.childNodes[i]; 
     alert('This is edit'+j+': '+input); 
    } 

JSFiddle

0

Thật không may đây là HTML không hợp lệ. ID phải là duy nhất trong toàn bộ tệp HTML.

Khi bạn sử dụng Javascript của document.getElementById(), nó phụ thuộc vào trình duyệt, phần tử nào sẽ trở lại, phần lớn là phần tử đầu tiên có ID nhất định.

Bạn sẽ không còn cơ hội nào khác để gán lại ID của mình hoặc sử dụng thuộc tính class.

5

ID đã cho chỉ có thể được sử dụng một lần trong một trang. HTML không hợp lệ để có nhiều đối tượng có cùng ID, ngay cả khi chúng nằm trong các phần khác nhau của trang.

Bạn có thể thay đổi HTML của bạn như thế này:

<div id="div1" > 
    <input type="text" class="edit1" /> 
    <input type="text" class="edit2" /> 
</div> 
<div id="div2" > 
    <input type="text" class="edit1" /> 
    <input type="text" class="edit2" /> 
</div> 

Sau đó, bạn có thể nhận được các mục đầu tiên trong div1 với một chọn CSS như thế này:

#div1 .edit1 

On trong jQuery:

$("#div1 .edit1") 

Hoặc, nếu bạn muốn lặp lại các mục trong một trong các div của mình, bạn có thể làm như sau:

$("#div1 input").each(function(index) { 
    // do something with one of the input objects 
}); 

Nếu tôi không thể sử dụng khung như jQuery hoặc YUI, tôi sẽ lấy Sizzle và bao gồm nó cho logic chọn của nó (nó là cùng một công cụ chọn như bên trong jQuery). dễ dàng hơn với thư viện bộ chọn tốt.

Nếu tôi không thể sử dụng ngay cả Sizzle (có thể giảm đáng kể năng suất của nhà phát triển), bạn có thể sử dụng các hàm DOM đơn giản để di chuyển con của một phần tử đã cho.

Bạn sẽ sử dụng các hàm DOM như childNodes hoặc firstChild và nextSibling và bạn phải kiểm tra nodeType để đảm bảo bạn chỉ có loại phần tử bạn muốn. Tôi không bao giờ viết mã theo cách đó vì nó kém hiệu quả hơn nhiều so với sử dụng thư viện bộ chọn.

+0

Tôi không thể sử dụng jQuery, hoặc, bạn có thể hiển thị mã javascript mà không có bất kỳ framwork? Tôi mới sử dụng javascript. – eric2323223

+0

tại sao không sử dụng tên lớp thay vì id. –

1

Trong id HTML phải là duy nhất. Tôi đề nghị bạn thay đổi mã của bạn thành một cái gì đó như thế này:

<div id="div1" > 
    <input type="text" name="edit1" id="edit1" /> 
    <input type="text" name="edit2" id="edit2" /> 
</div> 
<div id="div2" > 
    <input type="text" name="edit1" id="edit3" /> 
    <input type="text" name="edit2" id="edit4" /> 
</div> 
1
Sample Html code 
<div id="temp"> 
     F1 <input type="text" value="111"/><br/> 
     F2 <input type="text" value="222"/><br/> 
     F3 <input type="text" value="333"/><br/> 
     Type <select> 
     <option value="A">A</option> 
     <option value="B">B</option> 
     <option value="C">C</option> 
     </select> 
     <input type="button" value="Go" onclick="getVal()"> 
    </div> 

Javascript 

    function getVal() 
    { 
     var test = document.getElementById("temp").getElementsByTagName("input"); 
     alert("Number of Input Elements "+test.length); 
     for(var i=0;i<test.length;i++) 
     { 
      if(test[i].type=="text") 
      { 
      alert(test[i].value); 
      } 
     } 
     test = document.getElementById("temp").getElementsByTagName("select"); 
     alert("Select box "+test[0].options[test[0].selectedIndex].text); 
    } 

By providing different tag names we can get all the values from the div. 
7
var x = document.getElementById("parent").querySelector("#child"); 
// don't forget a # 

hoặc

var x = document.querySelector("#parent").querySelector("#child"); 

hoặc

var x = document.querySelector("#parent #child"); 

hoặc

var x = document.querySelector("#parent"); 
var y = x.querySelector("#child"); 

ví dụ:

var x = document.querySelector("#div1").querySelector("#edit2"); 
-1

Bạn có thể thử này: $ ("# div1 # edit1")

+0

Vui lòng định dạng mã của bạn và giải thích cách đoạn mã này trả lời câu hỏi. Câu trả lời của bạn chưa hoàn thành.Nó có thể thích hợp hơn như một bình luận. –

Các vấn đề liên quan