2014-12-24 18 views
5
var myArray = []; 
myArray = document.querySelectorAll('.selected'); 

Và khi tôi gọi myArray.splice - nó không được xác định. Làm thế nào tôi có thể tránh điều này? Tôi cần loại bỏ một số phần tử DOM khỏi mảng đó.Ghép Javascript cho mảng các phần tử DOM

+0

bạn có thể hiển thị cho chúng tôi mã HTML, với lớp được chọn không? –

+0

myArray là một Nodelist không phải là một mảng bình thường – SNAG

+0

Tôi hy vọng bạn không tưởng tượng rằng việc loại bỏ các phần tử khỏi danh sách nút sẽ loại bỏ chúng khỏi tài liệu. Tại sao bạn muốn xóa các phần tử khỏi mảng? –

Trả lời

7

Sự cố là querySelectorAll(..) trả về danh sách các nút (NodeList) - không phải là mảng JS chuẩn.

Có thể bạn muốn một cái gì đó như dưới đây:

Array.prototype.slice.call(document.querySelectorAll('.selected'), <begin>, <end>); 

CẬP NHẬT

tôi đã bỏ lỡ phần mà bạn đang cố gắng để xóa, nhờ @torazaburo. May mắn thay, bạn có thể trực tiếp áp dụng bộ lọc trên NodeList thay vì đi qua một chuyển đổi mảng. Một cái gì đó như dưới đây:

var arrayOfNodes = [].filter.call(document.querySelectorAll(".selected"), function(curNodeItem) { 
    return shouldCurrentNodeBeRetained(curNodeItem)? true : false; 
    //expanded for clarity.  
}); 
+0

Anh ấy đang cố gắng gọi 'splice' để xóa các phần tử chứ không phải' slice' để chọn chúng. –

+0

@torazaburo Cảm ơn, tôi đã bỏ lỡ điều đó. Tôi đã cập nhật bài đăng của mình. – SuperSaiyan

6

querySelectorAll là một NodeListarray-like collection, nhưng nó không phải là một mảng, vì nó không kế thừa từ Array.prototype. Để chuyển nó sang mảng thực bạn sẽ sử dụng slice theo cách này:

var myArray = [].slice.call(document.querySelectorAll('.selected')); 

Có thể sử dụng slice như thế này do thực tế rằng Array.prototype.slice là cố ý phương pháp chung, có nghĩa là nó thực hiện nội không kiểm tra nếu this giá trị thực tế là Array. Vì vậy, slice có thể được sử dụng với bất kỳ đối tượng mảng nào, có chỉ mục số và thuộc tính length.

1

document.querySelectorAll trả về một NodeList, không phải là một mảng.

Do đó không có phương pháp Splice trên NodeList Theo mặc định.

Tuy nhiên bạn có thể thử nghiệm phương pháp tương tự cho danh sách nút.

Đây là một hoạt động JSFiddle, nó loại bỏ các phần tử như mối nối trực tiếp từ DOM, bạn có thể sửa đổi nó theo bất kỳ cách nào bạn muốn.

var myArray = []; 
myArray = document.querySelectorAll('.selected'); 

//This is a primitive analogue of splice without adding new elements, it will not remove element from NodeList, however will remove it directly from dome, then it will return the resulting array (As Array), because NodeList is unmodifiable; 
NodeList.prototype.splice = function(pos, numToRemove){ 
    var initRemCount = remCount = numToRemove ? numToRemove : 1; 
    var removed = []; 
    for(var i = 0; i < this.length; i++){ 
     if(!remCount) 
      break; 
     var elm = this[i]; 
     if(i >= pos){ 
      //elm.parentElement.removeChild(elm); //I commented this out, 'cause you say you dont want to delete members from DOM, uncomment this to do so 
      remCount--; 
     } 
    } 
    return [].slice.call(this, pos, pos + initRemCount); 
} 

var resultArray = myArray.splice(2, 2); 

//This is the Araay already not a NodeList 
console.log(resultArray); 
+1

Nó hầu như không cần thiết để gây ô nhiễm nguyên mẫu 'NodeList' với một thói quen mới (đặc biệt là thường trình), khi bạn chỉ đơn giản có thể chuyển đổi nodelist thành một mảng. Ngoài ra, OP đã nói rằng ông không muốn các yếu tố bị loại bỏ khỏi DOM. Cuối cùng, việc triển khai này khởi động từ API 'Array.splice' bằng cách không xử lý các đối số bổ sung để thêm các phần tử mới. –

+0

Tốt, thông báo. Xin lỗi tôi đã không đề cập đến rằng các đối tượng phải ở trong DOM. Tuy nhiên cal bạn làm rõ phần đầu tiên của bình luận của bạn. –

+0

Điều tôi muốn nói là vấn đề này hầu như luôn được xử lý bằng cách chuyển đổi nodelist thành một mảng; sau đó bạn có thể sử dụng 'Array # splice' hiện có trực tiếp.Giải pháp của bạn sẽ làm việc tốt, nhưng tôi nghi ngờ nó bạn muốn đặt tất cả các phương thức mảng trên NodeList, đó là hướng này sẽ được đưa bạn. –

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