Làm cách nào để xóa một phần tử HTML bằng Javascript?


124

Tôi là một người mới hoàn toàn. Ai đó có thể cho tôi biết cách xóa một phần tử HTML bằng Javascript gốc không phải jQuery không.

index.html

<html>
<head>
 <script type="text/javascript" src="myscripts.js" > </script>
 <style>
 #dummy {
  min-width: 200px;
  min-height: 200px;
  max-width: 200px;
  max-height: 200px;
  background-color: #fff000;
 }
 </style>
</head>
<body>
 <div id="dummy"></div>

 <form>
  <input type="submit" value="Remove DUMMY" onclick="removeDummy(); "/>
 </form>
</body>

myscripts.js

function removeDummy() {
 var elem = document.getElementById('dummy');
 elem.parentNode.removeChild(elem);
}

Điều gì xảy ra khi tôi nhấp vào nút gửi, đó là nó sẽ biến mất trong một thời gian rất ngắn và sau đó xuất hiện trở lại ngay lập tức. Tôi muốn loại bỏ hoàn toàn phần tử khi tôi nhấp vào nút.


Điều gì sẽ xảy ra nếu tôi nhấp vào nó, phát hiện lỗi và nhấn dừng ?
alex

Xin lỗi, đó là chủ đề nhưng thực sự rất buồn cười, anh ấy / cô ấy đặt tên cho anh ấy- / mình là "Newbie Coder" và bây giờ hồ sơ có danh tiếng khoảng 9000. Hỏi điều gì đó trong "thời xưa tốt đẹp" thực sự có lợi nhuận ngày nay. :)
Rene

Câu trả lời:


189

Điều đang xảy ra là biểu mẫu đang được gửi đi, và vì vậy trang đang được làm mới (với nội dung ban đầu). Bạn đang xử lý clicksự kiện trên nút gửi.

Nếu bạn muốn xóa phần tử và không gửi biểu mẫu, hãy xử lý submitsự kiện trên biểu mẫu và trả về falsetừ trình xử lý của bạn:

HTML:

<form  onsubmit="return removeDummy(); ">
    <input type="submit" value="Remove DUMMY"/>
</form>

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}

Nhưng bạn không cần (hoặc muốn) một biểu mẫu cho điều đó, không phải nếu mục đích duy nhất của nó là xóa div giả. Thay thế:

HTML:

<input type="button" value="Remove DUMMY" onclick="removeDummy()" />

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}

Tuy nhiên , phong cách thiết lập trình xử lý sự kiện đó đã lỗi thời. Dường như bạn có bản năng tốt khi mã JavaScript của bạn nằm trong tệp của chính nó và như vậy. Bước tiếp theo là tiến xa hơn và tránh sử dụng onXYZcác thuộc tính để kết nối các trình xử lý sự kiện. Thay vào đó, trong JavaScript của bạn, bạn có thể kết nối chúng với cách mới hơn (khoảng năm 2000):

HTML:

<input id='btnRemoveDummy' type="button" value="Remove DUMMY"/>

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}
function pageInit() {
    // Hook up the "remove dummy" button
    var btn = document.getElementById('btnRemoveDummy');
    if (btn.addEventListener) {
        // DOM2 standard
        btn.addEventListener('click', removeDummy, false);
    }
    else if (btn.attachEvent) {
        // IE (IE9 finally supports the above, though)
        btn.attachEvent('onclick', removeDummy);
    }
    else {
        // Really old or non-standard browser, try DOM0
        btn.onclick = removeDummy;
    }
}

... sau đó gọi pageInit();từ một scriptthẻ ở cuối trang của bạn body(ngay trước </body>thẻ đóng ) hoặc từ trongwindow load sự kiện, mặc dù điều đó xảy ra rất muộn trong chu kỳ tải trang và do đó thường không tốt cho việc kết nối sự kiện trình xử lý ( ví dụ: nó xảy ra sau khi tất cả các hình ảnh cuối cùng đã được tải).

Lưu ý rằng tôi đã phải thực hiện một số xử lý để đối phó với sự khác biệt của trình duyệt. Có thể bạn sẽ muốn một hàm để kết nối các sự kiện để bạn không phải lặp lại logic đó mỗi lần. Hoặc xem xét sử dụng một thư viện như jQuery , Prototype , YUI , Closure hoặc bất kỳ nào khác để giải quyết những khác biệt của trình duyệt cho bạn. Điều rất quan trọng là phải hiểu những thứ cơ bản đang diễn ra, cả về nguyên tắc cơ bản JavaScript và nguyên tắc cơ bản về DOM, nhưng các thư viện xử lý rất nhiều điểm mâu thuẫn và cũng cung cấp rất nhiều tiện ích hữu ích - như một phương tiện kết nối các trình xử lý sự kiện để xử lý sự khác biệt của trình duyệt. Hầu hết chúng cũng cung cấp cách thiết lập một hàm (như ) để chạy ngay khi DOM sẵn sàng được thao tác, rất lâu trước khi kích hoạt.pageInitwindow load


Thay đổi nó thành type="button"hoặc đưa return false;vào hàm JS của bạn
Pav

@Pav: Tôi nghĩ tôi sẽ cố gắng gửi vì đây chỉ là một bài tập thử nghiệm. Tôi sẽ thực hiện một số dự án sử dụng submit để tốt hơn là tôi nên quen với nó ... Dù sao cũng cảm ơn vì ý tưởng.
Newbie Coder

@Newbie: Tôi đã thêm một vài lưu ý nữa.
TJ Crowder

2
tại sao không chỉ làm elem.remove ();
Muhammad Umer

1
@ Ghos3t - Một số cách: 1. Bất kỳ hàm nào bạn gọi từ trình xử lý kiểu thuộc tính phải là một toàn cục và không gian tên chung đã Thực sự đông đúc ™ và thật dễ dàng để chọn một tên hàm xung đột với một cái gì đó khác (điều này có thể được giải quyết bằng cách sử dụng một đối tượng có tên có thể là duy nhất và đặt tất cả các trình xử lý của bạn vào nó). 2. Sử dụng theo cách thuộc tính cũ (hoặc gán cho thuộc onxyztính trên phần tử) chỉ cho phép một trình xử lý duy nhất và nếu bạn gán cho thuộc tính, bạn sẽ thay thế bất cứ thứ gì từng có ở đó, vì vậy nó không hoạt động tốt với những người khác. (tiếp)
TJ Crowder

34

Chỉ cần làm điều này element.remove();

Hãy thử nó ở đây XEM

http://jsfiddle.net/4WGRP/


5
Hãy cẩn thận với điều này, vì đây có vẻ là một bổ sung khá mới và không có hỗ trợ trình duyệt đầy đủ, cụ thể là IE và FF phiên bản 22 trở về trước ( red-team-design.com/… ).
dule

1
Cá nhân tôi sẽ đợi thêm 5 năm nữa để sử dụng cái này
slbetman

2
Chà, tính năng này hiện đã được hỗ trợ một cách công bằng: caniuse.com/#search=remove . Tôi sẽ chấp nhận sử dụng nó ngay bây giờ. Nếu bạn thực sự cần hỗ trợ IE11, tôi cho rằng một polyfill có thể dễ dàng được xây dựng ...
jehon

5
Viết mã chống lại tương lai tốt hơn là lập trình cho quá khứ. Tiết kiệm cho mình thời gian bảo trì, và sử dụng.remove()
Gibolt

9

Bạn nên sử dụng input type = "button" thay vì input type = "submit".

<form>
  <input type="button" value="Remove DUMMY" onclick="removeDummy(); "/>
 </form>

Kiểm tra Trung tâm nhà phát triển Mozilla để biết các tài nguyên html và javascript cơ bản


1
Tôi đã thay đổi liên kết của bạn từ W3Schools sang Trung tâm nhà phát triển Mozilla. Hãy xem w3fools.com để biết lý do của tôi ... Ngoài ra, câu trả lời hay :)
Alastair Pitts

2
@Alastair Pitts - không sao. Tôi chỉ muốn trỏ PO đến các hướng dẫn cơ bản về html và js ..
CoderHawk

8

JavaScript của bạn là đúng. Nút của bạn có type="submit"làm cho trang làm mới.


5

Nó xuất hiện lại vì nút gửi của bạn tải lại trang. Cách đơn giản nhất để ngăn chặn hành vi này là thêm một return falsevào onclicktương tự như vậy:

<input type="submit" value="Remove DUMMY" onclick="removeDummy(); return false;" />

4

Thay đổi loại đầu vào thành "nút". Như TJ và Pav đã nói, biểu mẫu đang được gửi. Javascript của bạn trông đúng, và tôi khen ngợi bạn đã thử nó theo cách không phải JQuery :)


Tôi nghĩ rằng tôi sẽ dính vào trình bởi vì đây chỉ là một bài tập thực nghiệm cho các dự án tương lai của tôi mà sử dụng nộp vì vậy tôi tốt hơn làm quen với nó ...
Newbie Coder

4

index.html

<input id="suby" type="submit" value="Remove DUMMY"/>

myscripts.js

document.addEventListener("DOMContentLoaded", {
//Do this AFTER elements are loaded

    document.getElementById("suby").addEventListener("click", e => {
        document.getElementById("dummy").remove()
    })

})

3

Đó là mã phù hợp. Điều có thể xảy ra là biểu mẫu của bạn đang gửi và bạn thấy trang mới (nơi phần tử sẽ tồn tại trở lại).


3

Hãy thử chạy mã này trong tập lệnh của bạn .

document.getElementById("dummy").remove();

Và hy vọng nó sẽ loại bỏ phần tử / nút.


2

Những công việc này. Chỉ cần tháo nút khỏi "hình nộm" divnếu bạn muốn giữ lại nút.

function removeDummy() {
  var elem = document.getElementById('dummy');
  elem.parentNode.removeChild(elem);
  return false;
}
#dummy {
  min-width: 200px;
  min-height: 200px;
  max-width: 200px;
  max-height: 200px;
  background-color: #fff000;
}
<div id="dummy">
  <button onclick="removeDummy()">Remove</button>
</div>


1

Tôi cũng vẫn là một người mới, nhưng đây là một cách đơn giản và dễ dàng: Bạn có thể sử dụng externalHTML, là toàn bộ thẻ, không chỉ một phần:

EX: <tag id='me'>blahblahblah</tag>innerHTML sẽ là blahblahblah, và externalHTML sẽ là toàn bộ , <tag id='me'>blahblahblah</tag>.


Vì vậy, ví dụ: nếu bạn muốn xóa thẻ, về cơ bản nó sẽ xóa dữ liệu của nó, vì vậy nếu bạn thay đổi ngoàiHTML thành một chuỗi trống, nó giống như xóa nó.

<body>
    <p id="myTag">This is going to get removed...</p>
    <input type="button" onclick="javascript:
        document.getElementById('myTag').outerHTML = '';//this makes the outerHTML (the whole tag, not what is inside it)
    " value="Remove Praragraph">
</body>

Thay vào đó, nếu bạn chỉ muốn không hiển thị nó, bạn có thể tạo kiểu cho nó trong JS bằng cách sử dụng các thuộc tính hiển thị, độ mờ và hiển thị.

document.getElementById('foo').style.visibility = hidden;
//or
document.getElementById('foo').style.opacity = 0;
//or
document.getElementById('foo').style.display = none;



Lưu ý rằng opacity phần tử vẫn hiển thị, chỉ là bạn không thể nhìn thấy nó nhiều. Ngoài ra, bạn có thể chọn văn bản, sao chép, dán và làm mọi thứ bạn có thể làm bình thường, mặc dù nó ẩn.
Visibility phù hợp với tình huống của bạn hơn, nhưng nó sẽ để lại một khoảng trống trong suốt lớn bằng phần tử mà nó được áp dụng.
Tôi khuyên bạn nên hiển thị, tùy thuộc vào cách bạn tạo trang web của mình. Hiển thị về cơ bản xóa phần tử khỏi chế độ xem của bạn, nhưng bạn vẫn có thể thấy phần tử đó trong DevTools. Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.