2012-06-22 25 views
12

Tôi đã tạo một sự kiện jquery tùy chỉnh được gọi là 'tải' trong ứng dụng của tôi. Tôi muốn nối thêm một phần tử mặt nạ với một spinner, khi sự kiện này được kích hoạt. Tôi có thể tìm ra phần đó mà không có vấn đề gì. Tuy nhiên, một số yếu tố (hình ảnh, đầu vào biểu mẫu, v.v.) không thể nối thêm các phần tử con. Tôi cần để có thể phát hiện nếu mục tiêu của sự kiện này có thể nhận các phần tử con. Nếu nó không thể, sau đó tôi sẽ thêm mặt nạ spinner & vào phần tử cha của nó.Làm cách nào để bạn phát hiện xem phần tử html có thể nối thêm các nút con không?

Trả lời

5

Bạn phải kiểm tra tên:

/*global $, jQuery */ 

function isVoid(el) { 
    var tags = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 
       'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'], 
     i = 0, 
     l, 
     name; 

    if (el instanceof jQuery) { 
     el = el[0]; 
    } 

    name = el.nodeName.toLowerCase(); 

    for (i = 0, l = tags.length; i < l; i += 1) { 
     if (tags[i] === name) { 
      return true; 
     } 
    } 
    return false; 
} 

Và sử dụng nó như thế này:

var el = document.getElementById('el'), 
    elj = $('#el'); 

if (!isVoid(el)) { 
    // append 
} 
+0

indexOf không phải là trình duyệt chéo cho các mảng: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf – Joe

+0

Sử dụng _.indexOf nếu bạn hỗ trợ IE8 và cũ hơn – jasssonpet

+0

Tốt. Có thể đáng giá thêm ''# text'' chỉ trong trường hợp một nút văn bản tìm đường vào. –

1

Bạn có thể thêm phần tử con, chúng sẽ không hiển thị. Điều này nghe có vẻ giống như một sự khác biệt ngữ nghĩa, nhưng điều đó rất quan trọng đối với vấn đề của bạn: DOM không biết liệu một thẻ cụ thể có được hiển thị hay không.

Tốt nhất là chỉ để kiểm tra thủ công:

var allowChildren = function(elem) { 
    return ! (elem.nodeName in { INPUT : true, IMG : true }) ; 
}; 
+0

Tôi chưa bao giờ thấy rằng cú pháp boolean. Nó có hợp lệ không? Vì vậy, tôi cho rằng tôi có thể tra cứu spec cho các phần tử void, và thêm nó vào hash đó. – demersus

+1

Tôi nghĩ rằng việc tạo ra một bảng các yếu tố void sẽ là giải pháp thực sự duy nhất. Mặc dù tôi cho rằng bạn có nghĩa là 'return! {Input: true, img: true} [elem.nodeName]' –

+0

http://jsfiddle.net/mblase75/eGyRH/3/ - Chrome cho phép tôi thêm một phần tử con vào một ' 'thẻ, ngay cả khi thẻ không được hiển thị. Nó hiển thị trong trình gỡ rối DOM, không có trong cửa sổ trình duyệt. – Blazemonger

0

http://jsfiddle.net/mblase75/eGyRH/3/ - Chrome cho phép tôi thêm phần tử con vào thẻ <input>, mặc dù thẻ không được hiển thị. Nó hiển thị trong trình gỡ rối DOM, không có trong cửa sổ trình duyệt.

Tuy nhiên, tôi có thể kiểm tra nó .width() và xem đó là bằng không hay không: http://jsfiddle.net/mblase75/eGyRH/4/

alert($('.element').append('<span>asdf</span>').children().width());​ 

Tuy nhiên, đây cũng sẽ là zero chiều rộng nếu, ví dụ, tôi thêm khoảng một ẩn div: http://jsfiddle.net/mblase75/eGyRH/5/ - vì vậy nó không hoàn toàn đáng tin cậy.

0

Câu trả lời được chấp nhận có một fuction rất đẹp dựa trên which types of nodes can be void. Nó có thể được thay thế bằng một jQuery one-liner:

node.is("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")

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