Giả sử tôi có ba thành phần <div>
trên một trang. Làm cách nào tôi có thể trao đổi các vị trí của số <div>
đầu tiên và thứ ba? jQuery là tốt.Phần tử di chuyển JavaScript trong DOM
Trả lời
Trivial với jQuery
$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');
Nếu bạn muốn làm điều đó lặp đi lặp lại, bạn sẽ cần phải sử dụng bộ chọn khác nhau kể từ khi divs sẽ giữ lại id của họ khi họ đang di chuyển xung quanh.
$(function() {
setInterval(function() {
$('div:first').insertAfter($('div').eq(2));
$('div').eq(1).insertBefore('div:first');
}, 3000);
});
jQuery.fn.swap = function(b){
b = jQuery(b)[0];
var a = this[0];
var t = a.parentNode.insertBefore(document.createTextNode(''), a);
b.parentNode.insertBefore(a, b);
t.parentNode.insertBefore(b, t);
t.parentNode.removeChild(t);
return this;
};
và sử dụng nó như thế này:
$('#div1').swap('#div2');
nếu bạn không muốn sử dụng jQuery bạn có thể dễ dàng thích nghi với chức năng.
Không cần phải sử dụng một thư viện cho một công việc tầm thường như vậy:
var divs = document.getElementsByTagName("div"); // order: first, second, third
divs[2].parentNode.insertBefore(divs[2], divs[0]); // order: third, first, second
divs[2].parentNode.insertBefore(divs[2], divs[1]); // order: third, second, third
này có tài khoản thực tế là getElementsByTagName
trả về một NodeList sống được tự động cập nhật để phản ánh thứ tự của các yếu tố trong DOM khi chúng được điều khiển.
Bạn cũng có thể sử dụng:
var divs = document.getElementsByTagName("div"); // order: first, second, third
divs[0].parentNode.appendChild(divs[0]); // order: second, third, first
divs[1].parentNode.insertBefore(divs[0], divs[1]); // order: third, second, third
và có nhiều hoán vị có thể khác, nếu bạn cảm thấy như thử nghiệm:
divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0]));
ví dụ :-)
Đúng, nhưng thật khó để tranh luận với sự sang trọng và dễ đọc mà một cái gì đó giống như jQuery cung cấp - chưa kể đến khả năng nâng cao ra khỏi hộp. –
Điều đó nói rằng, 1 cho cách tiếp cận trần mã hóa. –
Có, nhưng ai chỉ làm điều này? – tvanfosson
Jquery cách tiếp cận nêu trên đầu sẽ hoạt động. Bạn cũng có thể sử dụng JQuery và CSS .Say cho ví dụ trên Div bạn đã áp dụng class1 và div2 bạn đã áp dụng class class2 (ví dụ: mỗi lớp css cung cấp vị trí cụ thể trên trình duyệt), bây giờ bạn có thể trao đổi các lớp bằng jquery hoặc javascript (sẽ thay đổi vị trí)
var swap = function() {
var divs = document.getElementsByTagName('div');
var div1 = divs[0];
var div2 = divs[1];
var div3 = divs[2];
div3.parentNode.insertBefore(div1, div3);
div1.parentNode.insertBefore(div3, div2);
};
Chức năng này có vẻ lạ, nhưng nó phụ thuộc rất nhiều vào các tiêu chuẩn để hoạt động bình thường. Trong thực tế, nó có vẻ hoạt động tốt hơn the jQuery version that tvanfosson posted mà dường như chỉ thực hiện trao đổi hai lần.
Những đặc điểm tiêu chuẩn nào mà nó dựa vào?
insertBefore Chèn nút mớiChild trước nút con hiện tại refChild. Nếu refChild là không, hãy chèn newChild tại vào cuối danh sách trẻ em. Nếu newChild là đối tượng DocumentFragment, tất cả các con của nó là được chèn vào, theo cùng thứ tự, trước refChild. Nếu newChild đã là trên cây, nó được loại bỏ trước tiên.
Xin lỗi vì chạm chủ đề này Tôi vấp trên "hoán đổi DOM-yếu tố" vấn đề và chơi xung quanh một chút
Kết quả là một "giải pháp" jQuery bản địa mà có vẻ là thực sự khá (tiếc là tôi không biết whats xảy ra tại internals jQuery khi làm điều này)
Bộ luật:
$('#element1').insertAfter($('#element2'));
các tài liệu jQuery nói t mũ insertAfter()
di chuyển phần tử và không sao chép nó
.before và .Sau
Sử dụng vani hiện đại JS! Cách tốt hơn/sạch hơn so với trước đây
const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
const div3 = document.getElementById("div3");
div2.after(div1);
div2.before(div3);
Browser Support - 84% toàn cầu, 87% ở Hoa Kỳ như của Mar '18
Chưa hỗ trợ Internet Explorer. – Norris
Bạn không cần phải viết mã ít bảo trì hơn để hỗ trợ mọi người trên các trình duyệt cũ hoặc không tuân thủ các tiêu chuẩn. Trừ khi bạn làm việc trong doanh nghiệp, ít người dùng sẽ bỏ lỡ – Gibolt
Các phương pháp khác cũng hoạt động tốt liên quan đến khả năng bảo trì, đặc biệt khi gói trong một chức năng sạch đẹp. Tôi là tất cả để viết mã hiện đại, nhưng điều này là chảy máu cạnh. Thật tuyệt khi biết tương lai nắm giữ điều gì, nhưng nhiều như tôi không thích bất cứ điều gì liên quan đến IE - điều quan trọng là phải biết được tác động của quyết định của bạn là gì. Trong trường hợp này - một ứng dụng web bị hỏng trong bất kỳ trình duyệt IE nào. Nếu đó là okay với bạn - tuyệt vời!Tôi đã thêm nhận xét chỉ để thông báo cho bất kỳ ai googling này :) – Norris
- 1. Phần tử DOM di chuyển jQuery bên trong parent
- 2. Di chuyển phần tử DOM có nối thêm()?
- 3. Internet Explorer: trạng thái di chuột trở nên dính khi phần tử DOM mục tiêu được di chuyển trong DOM
- 4. Javascript DOM: Đặt thuộc tính phần tử DOM tùy chỉnh
- 5. Làm cách nào để di chuyển một phần tử trong DOM?
- 6. Thêm các phần tử mới vào DOM bằng JavaScript (appendChild)
- 7. Cách di chuyển phần tử HTML
- 8. Di chuyển chuột trên phần tử
- 9. Cập nhật dom khi di chuyển trong ứng dụng Phonegap
- 10. knockout.js - Nhận ViewModel từ phần tử DOM
- 11. PHP DOM thay thế phần tử bằng phần tử mới
- 12. Chuyển ID phần tử sang hàm Javascript
- 13. Thêm các phần tử bên trong một phần tử DOM khác trong MooTools
- 14. Javascript: Đặt onclick động và tự chuyển qua phần tử
- 15. Di chuyển phần tử hoạt động mất sự kiện di chuột trong trình khám phá internet
- 16. Thêm biến vào các phần tử DOM
- 17. Đối tượng jQuery và phần tử DOM
- 18. Di chuột một phần tử và thay đổi một phần tử khác (không sử dụng Javascript)
- 19. Phát hiện "chạy" các phần tử DOM trong jQuery
- 20. GWT thêm ClickHandler vào phần tử DOM
- 21. Namespaces Lấy từ phần tử trong Java (sử dụng DOM)
- 22. Di chuyển toàn bộ phần tử bằng lxml.etree
- 23. Cách di chuyển phần tử con từ cha mẹ này sang phần tử khác bằng cách sử dụng jQuery
- 24. Ẩn phần tử hoặc tạo khi đang di chuyển?
- 25. JavaScript: Thêm trẻ em vào phần tử
- 26. Cách xử lý các phần tử DOM trong JavaScript để tránh rò rỉ bộ nhớ
- 27. Cách tốt nhất để tạo các phần tử DOM tĩnh lớn trong JavaScript là gì?
- 28. Di chuyển phần tử như vảy tuyết rơi
- 29. Di chuyển các phần tử Python giữa các danh sách
- 30. Chỉ tải phần hiển thị của DOM và loại bỏ phần tử DOM không hiển thị trong chế độ xem
Có một lỗi ở đâu đó. Nó chỉ xuất hiện để làm việc hai lần. http://jsbin.com/evedu –
Tôi chỉ mong nó hoạt động một lần. – tvanfosson
@Ionut - điểm là nó phụ thuộc vào vị trí tương đối của các phần tử. Một khi bạn thay đổi thứ tự bạn không còn có thể tìm thấy thứ nhất và thứ ba bởi id của họ và cần phải làm việc theo cách khác. Câu trả lời của tôi chỉ có nghĩa là minh họa chức năng của các phương thức để thực hiện nhiệm vụ được yêu cầu, không phải là một giải pháp toàn diện để trao đổi các div đầu tiên và thứ ba trong một tập hợp một số lần tùy ý. – tvanfosson