- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我们在页面上有一个 DIV x
,我们想将那个 DIV 的内容复制(“复制粘贴”)到另一个 DIV Và
中。我们可以这样做:
y.innerHTML = x.innerHTML;
或使用 jQuery:
$(y).html( $(x).html() );
但是,这种方法似乎不是一个好主意,应该避免使用。
(1)为什么要避免这种方法?
(2) 应该怎么做呢?
更新:
对于这个问题,我们假设 DIV x
中没有带 ID 的元素。
(抱歉,我忘了在我原来的问题中提到这个案例。)
Tóm lại:
我已经在下面发布了我自己对这个问题的回答(正如我最初打算的那样)。现在,我也打算接受我自己的答案 :P
,但是 lonesomeday 的答案太神奇了,我不得不接受它。
câu trả lời hay nhất
这种将 HTML 元素从一个地方“复制”到另一个地方的方法是对浏览器行为的误解的结果。浏览器不会将 HTML 文档保存在内存中的某个地方,并根据来自 JavaScript 的命令重复修改 HTML。
当浏览器首次加载页面时,它会phân tích cú pháp HTML 文档并将其转换为 DOM 结构。这是遵循 W3C 标准的对象关系(好吧,主要是……)。原来的 HTML 从那时起就完全多余了。浏览器不关心原始的 HTML 结构是什么;它对网页的理解是从中创建的 DOM 结构。如果您的 HTML 标记不正确/无效,Web 浏览器将以某种方式对其进行更正; DOM 结构不会以任何方式包含无效代码。
基本上,HTML 应该被视为一种序列化 DOM 结构的方式,以便通过 Internet 传递或存储在本地文件中。
因此,不应将其用于修改现有网页。 DOM(文档对象模型)有一个用于更改页面内容的系统。这是基于节点的关系,而不是基于 HTML 序列化。所以当你添加 cái đó
đến ul
,您有以下两个选项(假设 ul
是列表元素):
// option 1: innerHTML
ul.innerHTML += 'foobar ';
// option 2: DOM manipulation
var li = document.createElement('li');
li.appendChild(document.createTextNode('foobar'));
ul.appendChild(li);
现在,第一个选项看起来简单多了,但这只是因为浏览器为您抽象了很多:在内部,浏览器必须将元素的子元素转换为字符串,然后附加一些内容,然后转换字符串返回到 DOM 结构。第二个选项对应于浏览器对正在发生的事情的 native 理解。
第二个主要考虑因素是考虑 HTML 的局限性。当您考虑网页时,并非所有与元素相关的内容都可以序列化为 HTML。例如,与 x.onclick = function();
绑定(bind)的事件处理程序或 x.addEventListener(...)
不会在 innerHTML
中复制, 所以它们不会被复制。所以 Và
中的新元素不会有事件监听器。这可能不是您想要的。
所以解决这个问题的方法是使用 native DOM 方法:
for (var i = 0; i < x.childNodes.length; i++) {
y.appendChild(x.childNodes[i].cloneNode(true));
}
阅读 MDN 文档可能有助于理解这种做事方式:
现在这个问题(与上面代码示例中的选项 2 一样)是它非常冗长,比 innerHTML
长得多选项将是。这是当你欣赏拥有一个 JavaScript 库来为你做这种事情的时候。例如,在 jQuery 中:
$('#y').html($('#x').clone(true, true).contents());
这更明确地说明了您想要发生的事情。例如,除了具有各种性能优势和保留事件处理程序外,它还可以帮助您了解代码的作用。这对您作为 JavaScript 程序员的灵魂有好处,并且可以大大降低出现奇怪错误的可能性!
关于javascript - 为什么要 y.innerHTML = x.innerHTML;避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392930/
Chúng tôi đã có thư viện sử dụng AnyEvent. Nó sử dụng AnyEvent nội bộ và cuối cùng trả về một giá trị (đồng bộ - không sử dụng lệnh gọi lại). Có cách nào để sử dụng thư viện này với Mojolicious không? Chức năng của nó như sau: #
Tôi muốn tạo các lớp Java bằng JAXB từ các tệp XSD. Vấn đề là, tôi luôn nhận được một số lớp như thế này (đã xóa không gian tên): public static class Action { @X
Tôi có câu hỏi về thẻ đầu vào html hoặc các mặt nguyên tố p:input. Tại sao con trỏ luôn tự động nhảy đến trường nhập liệu. Chiều cao trang của tôi khá cao nên bạn cần cuộn xuống. Trường nhập nằm ở cuối trang và con trỏ tự động nhảy (tải) đến trang
Hôm nay tôi đang suy nghĩ về thiết kế hướng đối tượng và tôi tự hỏi liệu có nên tránh các câu lệnh hay không. Ý tưởng của tôi là trong mọi trường hợp cần có câu lệnh if, bạn chỉ cần tạo hai đối tượng thực hiện cùng một phương thức. Hai cách triển khai phương thức này chỉ là hai nhánh có thể có của câu lệnh if ban đầu.
Chuỗi graphNameUsed = graphName.getName(); nếu (graphType.equals("Tất cả") || graphType.equals(
Tôi có một bảng tình bạn TẠO BẢNG NẾU KHÔNG Tồn tại `friendList` ( `id` int(10) NOT NULL, `id_friend` int(10
Bối cảnh Debian 64. Bộ đôi lõi 2. Chơi xung quanh với các vòng lặp. Tôi đang sử dụng các biến thể khác nhau của cùng một vòng lặp, nhưng tôi muốn tránh các nhánh có điều kiện càng nhiều càng tốt. Nhưng ngay cả tôi cũng nghĩ rằng nó sẽ khó bị đánh bại. Tôi đã xem xét SSE hoặc dịch chuyển bit, nhưng nó vẫn cần một bước nhảy (
Gần đây tôi đã tạo một phương thức trong Java để lấy hoán vị của một chuỗi, nhưng khi chuỗi quá dài, nó sẽ báo lỗi này: java.lang.OutOfMemoryError: Java heap space Tôi chắc chắn rằng phương thức này hợp lệ,
Tôi đang làm việc với thư viện (C++) nơi tôi cần khởi tạo đối tượng bằng luồng. Mã mẫu do thư viện cung cấp sử dụng mã này: // Khai báo luồng đầu vào HfstInputStream *in = NULL tr;
Tôi có một truy vấn SQL và tôi đang sử dụng truy vấn con trong mệnh đề WHERE. Sau đó, tôi cần sử dụng lại cùng một truy vấn con để so sánh nó với một cột khác. Tôi cho rằng không có cách nào để truy cập "emp_education_list li" bên ngoài truy vấn phụ? tôi đoán
Tôi được biết rằng các hoạt động mạng không được phép trên luồng GUI. Đối với tôi thì ổn. Nhưng tại sao việc sử dụng mã này trên cuộc gọi lại nhấp vào nút Hộp thoại vẫn tạo ra NetworkOnMainThreadException? T mới
Có cách nào để tránh sử dụng chuỗi if và mã hóa cứng trong chuyển hướng hàm không, ý tưởng là nhận một chuỗi và gọi hàm thích hợp, có thể sử dụng mẫu/lập trình meta.. #include #include void account() {
Tôi đang cố tránh TIME_WAIT ở phía máy khách. Tôi kết nối rồi đặt O_NONBLOCK và SO_REUSEADDR. Tôi gọi đọc cho đến khi nó trả về 0. Khi đọc trả về 0, errno cũng là 0. TÔI
Tôi đang phát triển ứng dụng C++ Qt. Để hỗ trợ người dùng trong trường hợp ứng dụng hoặc thiết bị được kết nối của nó gặp trục trặc, chương trình sẽ xuất tất cả cài đặt bên trong và lưu trữ chúng trong một tệp thông thường (hiện là csv). Tập tin này sau đó sẽ được gửi đến công ty (ví dụ: qua đường bưu điện). để tránh
Tôi có một bộ POJO với siêu hạng công khai. Chúng được lưu trữ trong một mảng hai chiều thuộc loại siêu lớp. Bây giờ, tôi muốn lấy một đối tượng từ mảng và sử dụng các phương thức của lớp con. Điều này có nghĩa là tôi phải chuyển đổi chúng
Trong mã của mình, tôi thường sử dụng phương pháp này để tránh NullPointerException trong các câu lệnh khi Danh sách là null: if (myList != null && myList.size
Tôi đang cố tránh TIME_WAIT ở phía máy khách. Tôi kết nối rồi đặt O_NONBLOCK và SO_REUSEADDR. Tôi gọi đọc cho đến khi nó trả về 0. Khi đọc trả về 0, errno cũng là 0. TÔI
Trong các ngôn ngữ và/hoặc thư viện không hỗ trợ ngoại lệ, nhiều/gần như tất cả các hàm trả về giá trị cho biết hoạt động của chúng thành công hay thất bại - ví dụ nổi tiếng nhất có lẽ là các lệnh gọi hệ thống UN*X như open() hoặc chdir( ), Hoặc một số hàm libc. không có
Tôi cố gắng trích xuất các hàng theo giá trị. col1 df$col1[col1 == "A"] [1] "A" NA Tất nhiên tôi chỉ muốn "A". Làm cách nào để tránh R chọn giá trị NA? Nhân tiện, tôi nghĩ hành vi này rất nguy hiểm vì rất nhiều người rơi vào
Tôi muốn hợp nhất hai vectơ thành một tập dữ liệu và tích hợp nó với hàm biến đổi thành 5 cột mới vào tập dữ liệu hiện có. Đây là mã mẫu của tôi: vector1% rowwise()%>% mutate(vector2|>
Tôi là một lập trình viên xuất sắc, rất giỏi!