2012-01-05 19 views
24

document.getElementById('id of div that definately exists') trả về giá trị rỗng.getElementById trả về null?

Tôi đã tải javascript lần cuối để đảm bảo rằng tôi sẽ không cần phải lo lắng về sự kiện onload. Tôi cũng đã thử sử dụng sự kiện onload. Nó rất ma quái. Bất kỳ ý tưởng hoặc trợ giúp nào sẽ được đánh giá cao.

+2

bản sao của [Tại sao jQuery hoặc một phương pháp DOM như getElementById không tìm thấy nguyên tố này?] (Http://stackoverflow.com/q/14028959/1048572) – Bergi

+0

tôi có tình huống tương tự khi nội dung của tôi được tạo động và id truy vấn tập lệnh được gọi trước tập lệnh tạo nội dung có id đó.Tôi đã cố định thứ tự đó và nó làm việc cho tôi –

Trả lời

31

Nó có thể được gây ra bởi:

  1. cú pháp hợp lệ HTML (một số thẻ không được đóng cửa hoặc lỗi tương tự)
  2. Duplicate ID - có hai yếu tố HTML DOM với cùng một ID
  3. Có lẽ yếu tố bạn đang cố gắng để có được bằng ID được tạo động (được nạp bởi ajax hoặc tạo ra bởi kịch bản)?

Vui lòng đăng mã của bạn.

+9

# 2 thực sự sẽ không mang lại 'null' nhưng chỉ là phần tử đầu tiên của hai phần tử với id đó. – Bergi

+0

cảm ơn đã cứu mạng sống của tôi –

7

Có thể có nhiều lý do tại sao document.getElementById không hoạt động

  • Bạn có một ID hợp lệ

    ID và TÊN thẻ phải bắt đầu bằng một chữ cái ([A-Za-z]) và có thể được theo sau bởi bất kỳ số chữ cái, chữ số ([0-9]), dấu gạch ngang ("-"), dấu gạch dưới ("_"), dấu hai chấm (":") và dấu chấm ("."). (nguồn: What are valid values for the id attribute in HTML?)

  • bạn sử dụng một số id mà bạn đã sử dụng như <meta> tên trong tiêu đề của bạn (ví dụ như bản quyền, tác giả ...) có vẻ lạ, nhưng đã xảy ra với tôi: nếu bạn 'tái sử dụng IE hãy xem (tài nguyên: http://www.phpied.com/getelementbyid-description-in-ie/)

  • bạn đang nhắm mục tiêu một phần tử bên trong khung hoặc khung nội tuyến. Trong trường hợp này nếu iframe tải một trang trong cùng một tên miền của cha mẹ bạn nên nhắm mục tiêu các contentdocument trước khi tìm kiếm các yếu tố (nguồn: Calling a specific id inside a frame)

  • bạn chỉ cần tìm đến một phần tử khi nút không phải là nạp một cách hiệu quả trong DOM, hoặc có thể đó là một lỗi chính tả đơn giản

tôi nghi ngờ bạn sử dụng cùng một ID hai lần trở lên: trong trường hợp đó document.getElementById nên trả lại ít nhất là yếu tố đầu tiên

+0

Cảm ơn bạn đã có mẹo iframe, đã giúp tôi một loạt! –

41

Cũng phải cẩn thận như thế nào bạn thực hiện js trên trang e. Ví dụ: nếu bạn làm điều gì đó như thế này:

(function(window, document, undefined){ 

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

    console.log(foo); 

})(window, document, undefined); 

Điều này sẽ trả về không vì bạn sẽ gọi tài liệu trước khi tài liệu được tải.

lựa chọn tốt hơn ..

(function(window, document, undefined){ 

// code that should be taken care of right away 

window.onload = init; 

    function init(){ 
    // the code to be called when the dom has loaded 
    // #document has its nodes 
    } 

})(window, document, undefined);