Hôm qua, tôi đã viết về Reef, giải pháp thay thế nhẹ nhàng của tôi cho Vue và React. Trong vài ngày tới, tôi muốn xem các bộ phận khác nhau của nó hoạt động như thế nào
Hôm nay, chúng ta sẽ xem xét cách lấy một chuỗi HTML và chuyển đổi nó thành đánh dấu thực tế
Tại sao bạn cần điều này
Nếu bạn muốn chèn một chuỗi vào DOM, bạn có thể làm điều đó khá đơn giản với
Hi, universe!
0app.innerHTML = 'Hello, world!
';
Nhưng Reef không chỉ đẩy đánh dấu vào một yếu tố. Nó so sánh đánh dấu hiện có trong một phần tử với giao diện của nó và chỉ cập nhật những thứ cần thay đổi
Ví dụ: nếu nội dung hiện có bên trong
Hi, universe!
0 làHi, universe!
Reef sẽ chỉ cập nhật văn bản bên trong
Hi, universe!
1 thay vì tạo một phần tử hoàn toàn mớiĐể điều đó hoạt động, chúng tôi cần chuyển đổi các chuỗi HTML thành các phần tử HTML thực tế có thể được duyệt qua, ánh xạ và phân tích
Tạo một phương thức trợ giúp
Trước tiên, hãy tạo một hàm trợ giúp sẽ chấp nhận một chuỗi và trả về HTML
/**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
cách tiếp cận đơn giản
Cách đơn giản nhất để làm điều này là tạo một phần tử, chèn chuỗi vào với
Hi, universe!
0, sau đó trả về phần tử/**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
var dom = document.createElement['div'];
dom.innerHTML = str;
return dom;
};
Cách tiếp cận này không hoàn hảo, mặc dù
Mặc dù phần tử này bị tách rời—nghĩa là không thực sự nằm trong DOM hiện tại—trình duyệt vẫn sẽ thực hiện những việc như tải xuống các tệp hình ảnh
Thao tác này sẽ kích hoạt tệp hình ảnh để tải xuống, mặc dù phần đánh dấu chưa được hiển thị ở bất kỳ đâu
stringToHTML[''];
Một cách tốt hơn
Sau khi thực hiện một loạt nghiên cứu, tôi đã phát hiện ra một phương pháp trình duyệt riêng để tránh vấn đề này.
Hi, universe!
3. Đối tượng Hi, universe!
3 tạo một tài liệu DOM mới từ một chuỗiĐể sử dụng nó, bạn khởi tạo một thể hiện mới. Sau đó, bạn sử dụng phương thức
Hi, universe!
5 để chuyển đổi chuỗi của mình thành phần tử Hi, universe!
6 mới. Phương thức chấp nhận chuỗi làm đối số đầu tiên. Đặt đối số thứ hai thành Hi, universe!
7Bởi vì nó thực sự là một phần tử
Hi, universe!
6 mới, chúng tôi sẽ trả về Hi, universe!
9Hi, universe!
4Bây giờ chúng tôi có thể làm điều này và sẽ không có tải xuống nào được kích hoạt
stringToHTML[''];
Kết hợp hai cách tiếp cận
Phương pháp
Hi, universe!
3 thật tuyệt vời, nhưng phương pháp Hi, universe!
5 dừng lại ở IE10Tôi muốn kết hợp hai cách tiếp cận, sử dụng
Hi, universe!
3 khi nó được hỗ trợ và quay lại tạo một phần tử và sử dụng Hi, universe!
0 khi nó không được hỗ trợĐể kiểm tra hỗ trợ, chúng tôi sẽ gán IIFE cho biến
/**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
4Bên trong IIFE, trước tiên chúng tôi sẽ kiểm tra xem
/**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
5 có tồn tại trong /**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
6 không. Nếu không, chúng tôi sẽ trả lại /**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
7. Tiếp theo, chúng tôi sẽ cố gắng sử dụng Hi, universe!
5 để tạo một Hi, universe!
6. Nếu thất bại, chúng tôi sẽ trả lại /**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
// Code goes here...
};
7. Nếu không, chúng tôi sẽ trả lại /**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
var dom = document.createElement['div'];
dom.innerHTML = str;
return dom;
};
1Hi, universe!
7Bên trong phương pháp
/**
* Convert a template string into HTML DOM nodes
* @param {String} str The template string
* @return {Node} The template HTML
*/
var stringToHTML = function [str] {
var dom = document.createElement['div'];
dom.innerHTML = str;
return dom;
};
2 của chúng tôi, chúng tôi sẽ sử dụng có điều kiện Hi, universe!
3 khi nó được hỗ trợ và Hi, universe!
0 khi nó không được hỗ trợ