Câu trả lời được trình bày bởi Andreas Josas khá tốt. Tuy nhiên, mã có một số lỗi khi cụm từ tìm kiếm xuất hiện nhiều lần trong cùng một nút văn bản. Đây là giải pháp với những lỗi đó được sửa và bổ sung thêm phần thừa vào trong matchText để sử dụng và hiểu dễ dàng hơn. Bây giờ chỉ có thẻ mới được tạo trong hàm gọi lại và được trả lại cho matchText bằng cách trả về.
Cập nhật matchText chức năng với sửa lỗi:
var matchText = function(node, regex, callback, excludeElements) {
excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas']);
var child = node.firstChild;
while (child) {
switch (child.nodeType) {
case 1:
if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1)
break;
matchText(child, regex, callback, excludeElements);
break;
case 3:
var bk = 0;
child.data.replace(regex, function(all) {
var args = [].slice.call(arguments),
offset = args[args.length - 2],
newTextNode = child.splitText(offset+bk), tag;
bk -= child.data.length + all.length;
newTextNode.data = newTextNode.data.substr(all.length);
tag = callback.apply(window, [child].concat(args));
child.parentNode.insertBefore(tag, newTextNode);
child = newTextNode;
});
regex.lastIndex = 0;
break;
}
child = child.nextSibling;
}
return node;
};
Cách sử dụng:
matchText(document.getElementsByTagName("article")[0], new RegExp("\\b" + searchTerm + "\\b", "g"), function(node, match, offset) {
var span = document.createElement("span");
span.className = "search-term";
span.textContent = match;
return span;
});
Nếu bạn mong muốn để chèn anchor (liên kết) thẻ thay cho các thẻ span, thay đổi tạo ra yếu tố là "một "thay vì" span ", thêm một dòng để thêm thuộc tính href vào thẻ và thêm 'a' vào danh sách excludeElements để các liên kết sẽ không được tạo bên trong các liên kết.
Nguồn
2015-03-27 13:23:41
trong trường hợp đó bạn sẽ phải repace nút văn bản với nội dung html –
@ArunPJohny Làm thế nào để làm điều đó? – alt
@ JacksonGariety — bạn cần thay thế nút văn bản bằng phần tử span và các nút văn bản DOM mới hoặc sửa đổi thuộc tính innerHTML của cha mẹ. Có một chuyến đi, đăng những gì bạn thử. – RobG