2011-10-19 39 views
68

Được rồi, tôi đã từng sử dụng JavaScript trước đây, nhưng điều hữu ích nhất mà tôi đã viết là trình chuyển đổi kiểu CSS. Vì vậy, tôi hơi mới với điều này. Giả sử tôi có mã HTML như sau:Lấy phần tử bên trong phần tử theo lớp và ID - JavaScript

<div id="foo"> 
    <div class="bar"> 
     Hello world! 
    </div> 
</div> 

Làm cách nào để thay đổi "Hello world!" để "Tạm biệt thế giới!" ? Tôi biết cách document.getElementByClass và document.getElementById làm việc, nhưng tôi muốn cụ thể hơn. Xin lỗi nếu điều này đã được hỏi lúc trước.

Trả lời

126

Vâng, trước tiên bạn cần phải chọn các phần tử có hàm như getElementById.

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 

getElementById chỉ trả về một nút, nhưng getElementsByClassName trả về danh sách nút. Vì chỉ có một phần tử với tên lớp đó (theo như tôi có thể biết), bạn chỉ có thể lấy cái đầu tiên (đó là cái mà [0] dùng cho — nó giống như một mảng).

Sau đó, bạn có thể thay đổi html bằng .innerHTML.

targetDiv.innerHTML = "Goodbye world!"; 

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 
 
targetDiv.innerHTML = "Goodbye world!";
<div id="foo"> 
 
    <div class="bar"> 
 
     Hello world! 
 
    </div> 
 
</div>

+1

Nhận cha mẹ bằng ID là không cần thiết trong trường hợp này. 'document.getElementsByClassName' sẽ hoạt động tốt. – rvighne

+6

@rvighne các yêu cầu chính xác của OP là ông "muốn được cụ thể hơn". Người hỏi câu hỏi đã hỏi làm thế nào anh ta có thể cụ thể hơn trong quá trình duyệt cây DOM của mình. Việc sử dụng getElementByClassName không phải là một điểm của sự nhầm lẫn, nhưng tôi có thể thấy làm thế nào ai đó có thể dễ dàng nghĩ rằng tôi đã chỉ ra cả khi cần thiết. Họ không phải. Nếu bạn muốn chỉ nhắm mục tiêu các phần tử của một lớp nhất định nằm dưới một nút cụ thể của một ID nhất định chứ không phải các phần tử của cùng một lớp đó dưới một nút khác, thì đây là những gì bạn sẽ sử dụng. –

+1

@JosephMarikle Tôi hiểu rồi. Tôi tin rằng tôi đã đọc câu hỏi quá nhanh. – rvighne

10

Bạn có thể làm điều đó như thế này:

var list = document.getElementById("foo").getElementsByClassName("bar"); 
if (list && list.length > 0) { 
    list[0].innerHTML = "Goodbye world!"; 
} 

hoặc, nếu bạn muốn làm điều đó với với kiểm tra lỗi ít hơn và ngắn gọn hơn, nó có thể được thực hiện trong một dòng như thế này:

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!"; 

Giải thích:

  1. Bạn nhận phần tử với id="foo".
  2. Sau đó, bạn tìm thấy các đối tượng được chứa trong đối tượng đó có class="bar".
  3. Điều đó trả về một danh sách nút giống như mảng, vì vậy bạn tham chiếu mục đầu tiên trong nút đó
  4. Bạn có thể đặt innerHTML của mục đó để thay đổi nội dung của nó.

Cẩn thận: một số trình duyệt cũ không hỗ trợ getElementsByClassName (ví dụ: phiên bản cũ hơn của IE). Chức năng đó có thể được shimmed vào vị trí nếu thiếu.


Đây là nơi tôi khuyên bạn nên sử dụng thư viện có hỗ trợ bộ chọn CSS3 tích hợp hơn là lo lắng về khả năng tương thích của trình duyệt (cho phép người khác làm tất cả công việc). Nếu bạn muốn chỉ là một thư viện để làm điều đó, thì Sizzle sẽ làm việc tuyệt vời. Trong sizzle, điều này sẽ được thực hiện như thế này:

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!"; 

jQuery có thư viện sizzle built-in và trong jQuery, đây sẽ là:

$("#foo .bar").html("Goodbye world!"); 
+0

Cảm ơn bạn, tôi đã có rắc rối với document.getElementBy *. jQuery làm cho mọi việc trở nên dễ dàng hơn nhiều. –

4

Nếu đây cần phải làm việc trong IE 7 hoặc giảm bạn cần phải nhớ rằng getElementsByClassName không tồn tại trong tất cả các trình duyệt. Bởi vì điều này bạn có thể tạo getElementsByClassName của riêng bạn hoặc bạn có thể thử điều này.

var fooDiv = document.getElementById("foo"); 

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) { 
    childNode = fooDiv.childNodes[i]; 
    if (/bar/.test(childNode.className)) { 
     childNode.innerHTML = "Goodbye world!"; 
    } 
} 
+0

'getElementsByClassName' không hoạt động trong IE8, nhưng bạn có thể sử dụng' querySelectorAll' trong vị trí của nó (dù sao đi nữa). – user113716

+0

@ Ӫ _._ Ӫ ... lol ... đúng của bạn nhưng bạn chỉ chứng minh câu trả lời của tôi hơn nữa. Bạn không thể dựa vào getElementsByClassName nếu trang của bạn cần hoạt động trên nhiều trình duyệt. jQuery chắc chắn sẽ là một lựa chọn nhưng vì vậy hãy đặt mã trên. –

+0

Vâng, tôi có nghĩa là bình luận hỗ trợ câu trả lời của bạn, nhưng sau đó cũng chỉ ra rằng nó có thể sử dụng 'qSA' trong một shim để bạn vẫn có thể sử dụng mã gốc trong IE8. Mặc dù xem xét kỹ hơn giải pháp của bạn, bạn đã có một vài thứ cần sửa chữa. – user113716

-3

Bạn không nên sử dụng document.getElementById vì công việc của mình chỉ cho các điều khiển phía khách hàng mà id là cố định. Bạn nên sử dụng jquery thay vì như ví dụ dưới đây.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                            
<div id="foo"> 
    <div class="bar"> 
      Hello world! 
    </div> 
</div> 

sử dụng này: ""

$("[id^='foo']").find("[class^='bar']") 

// do not forget to add script tags as above 

nếu bạn muốn bất kỳ chỉnh sửa loại bỏ bất kỳ hoạt động sau đó chỉ cần thêm phía sau và làm các hoạt động

+7

Sử dụng vũ khí nhiệt hạch để tiêu diệt một con nai sẽ hoạt động nhưng hơi quá mức. Sử dụng thư viện jQuery nhiều kb để chọn một phần tử khi Javascript cung cấp chức năng đó trong mã cơ sở của nó là quá mức cần thiết. – Danejir

3

chức năng đệ quy:

function getElementInsideElement(baseElement, wantedElementID) { 
    var elementToReturn; 
    for (var i = 0; i < baseElement.childNodes.length; i++) { 
     elementToReturn = baseElement.childNodes[i]; 
     if (elementToReturn.id == wantedElementID) { 
      return elementToReturn; 
     } else { 
      return getElementInsideElement(elementToReturn, wantedElementID); 
     } 
    } 
} 
0

Cách dễ nhất để làm như vậy là:

function findChild(idOfElement, idOfChild){ 
    let element = document.getElementById(idOfElement); 
    return element.querySelector('[id=' + idOfChild + ']'); 
} 

hoặc có thể đọc được tốt hơn:

findChild = (idOfElement, idOfChild) => { 
    let element = document.getElementById(idOfElement); 
    return element.querySelector(`[id=${idOfChild}]`); 
} 
Các vấn đề liên quan