2009-12-29 27 views
6

tôi muốn một hàm tìm thấy một số chuỗi tôi đã có trong một mảng trong DOM và nhấn mạnh nó.javascript: tìm chuỗi trong dom và nhấn mạnh nó

ví dụ:

keywords[0] = 'linux'; 
keywords[1] = 'suse pro'; 

<body> 
    im a huge fan of <em>linux</em> and at the moment im using <em>suse pro</em> and finds it amazing. 
</body> 

làm thế nào để tôi làm điều đó theo cách đơn giản nhất. cảm ơn trước

EDIT: tôi đã tìm thấy một cách rất dễ dàng để thực hiện việc này: plugin đánh dấu jquery! chúc mừng!

+0

Sắp xếp các bản sao của http://stackoverflow.com/questions/1972409 (từ cùng một người) ngoại trừ câu hỏi đó hỏi làm thế nào để làm điều này trong PHP, trong khi điều này hỏi về cách làm điều đó trong Javascript. – MatrixFrog

+3

nhưng sau đó nó không phải là một dupe. 2 ngôn ngữ khác nhau của nó :) – ajsie

Trả lời

0

Đây có lẽ là cách dễ dàng nhất, nhưng có lẽ không phải là cách tốt nhất: http://www.tizag.com/javascriptT/javascript-string-replace.php (di chuyển xuống phía dưới, nơi nó nói "Thay thế Chức năng: Global Regular Expression"

Bạn sẽ thay thế linux với <em>linux</em> vv

+0

Tôi có một cảm giác có một cách tốt hơn. Đây chỉ là điều đầu tiên tôi nghĩ đến. – MatrixFrog

7

Tôi đã phải làm điều này một vài tháng trước, ban đầu một người nào đó sử dụng thao tác chuỗi của innerHTML như đề xuất của những người khác ở đây nhưng con đường dẫn đến điên rồ. tên lớp hoặc id. Chúng tôi cũng không muốn mangle bất kỳ javascript nhúng nào và vô tình gây ra đánh dấu không hợp lệ. Cũng cần phải xử lý nhúng phong cách css. Cuối cùng bạn kết thúc viết một trình phân tích cú pháp văn bản cho HTML4.0 + ECMAscript + css, ngay cả trong trường hợp giới hạn, là rất nhiều công việc - nó viết trình duyệt web của riêng bạn - IN JAVASCRIPT!

Nhưng chúng tôi đã có trình phân tích cú pháp HTML + JS + CSS trong trình duyệt web tạo ra cây DOM đẹp cho chúng tôi. Vì vậy, tôi quyết định sử dụng nó. Đây là những gì tôi đã đưa ra cuối cùng:

keywords = ['hello world','goodbye cruel world']; 
function replaceKeywords (domNode) { 
    if (domNode.nodeType === Node.ELEMENT_NODE) { // We only want to scan html elements 
     var children = domNode.childNodes; 
     for (var i=0;i<children.length;i++) { 
      var child = children[i]; 

      // Filter out unwanted nodes to speed up processing. 
      // For example, you can ignore 'SCRIPT' nodes etc. 
      if (child.nodeName != 'EM') { 
       replaceKeywords(child); // Recurse! 
      } 
     } 
    } 
    else if (domNode.nodeType === Node.TEXT_NODE) { // Process text nodes 
     var text = domNode.nodeValue; 

     // This is another place where it might be prudent to add filters 

     for (var i=0;i<keywords.length;i++) { 
      var match = text.indexOf(keywords[i]); // you may use search instead 
      if (match != -1) { 
       // create the EM node: 
       var em = document.createElement('EM'); 

       // split text into 3 parts: before, mid and after 
       var mid = domNode.splitText(match); 
       mid.splitText(keywords[i].length); 

       // then assign mid part to EM 
       mid.parentNode.insertBefore(em,mid); 
       mid.parentNode.removeChild(mid); 
       em.appendChild(mid); 
      } 
     } 
    } 
} 

Miễn là bạn cẩn thận về lọc những thứ bạn không muốn xử lý (ví dụ, các nút văn bản trống chỉ chứa khoảng trắng - có rất nhiều người trong số họ, tin tôi đi) điều này rất nhanh.

Bộ lọc bổ sung không được triển khai cho rõ ràng về thuật toán - còn lại dưới dạng bài tập cho người đọc.

+0

Tôi nên thay thế domNode bằng gì? tôi có văn bản trong div với id. – ajsie

+0

@unknown Bạn có thể gọi nó là 'replaceKeywords (document.getElementById (" someid "))'. @slebetman Bạn có thể muốn thay thế các hằng số '1' và' 3' bằng 'Node.ELEMENT_NODE' và' Node.TEXT_NODE' để rõ ràng hơn. –

+0

@Brian sẽ làm. Cũng để xử lý toàn bộ tài liệu bạn có thể gọi nó là 'replaceKeywords (document.body)' bộ lọc bỏ qua 'EM' sẽ ngăn không cho nó xử lý văn bản đã được xử lý. – slebetman

Các vấn đề liên quan