2015-11-19 26 views
7

Tôi cần phải tìm kiếm trong tài liệu bằng jQuery để tìm một từ cụ thể. Nó thực sự là một thương hiệu phải được in đậm và in nghiêng ở bất cứ nơi nào được sử dụng.Tìm kiếm nội dung cho chuỗi và sau đó chọn kiểu

Tôi có thể thực hiện việc này bằng cách sử dụng :contain nhưng chỉ trên cơ sở phần tử riêng lẻ. Tôi cần để có thể đi qua các neo, liệt kê các div, v.v.

$("a:contains('brand name')").html().replace('brand name'.... 

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

Cập nhật: Tôi đã làm việc này và thay thế mọi thứ trên một trang nhưng bây giờ tôi cần bọc trong một khoảng với một lớp. Gần như vậy nhưng bị vướng vào cái này. Một lần nữa một ý tưởng sẽ được đánh giá cao.

$("body *").contents().each(function() { 
    if(this.nodeType==3){ 
    this.nodeValue = this.nodeValue.replace(/brandname/g, 'colour'); 

    } 
}); 
+2

$ (": contains ('brand name')") sẽ trả về tất cả các phần tử. –

+0

'Nó thực sự là một tên thương hiệu phải được in đậm và in nghiêng ở bất cứ nơi nào được sử dụng' ** & **' Tôi có thể làm điều này bằng cách sử dụng: chứa nhưng chỉ trên cơ sở phần tử riêng lẻ. Tôi cần để có thể đi qua neo, danh sách divs vv' Nhưng gói e.g 'div' trong phần tử' b' không phải là đánh dấu HTML hợp lệ. Không thực sự rõ ràng những gì bạn đang mong đợi? –

+0

@ A.Wolff - mong đợi từ và chỉ từ 'BrandName' được bọc trong một khoảng trong bất kỳ trường hợp nào.Không phải

BrandName
, nhưng
BrandName
ShambalaG

Trả lời

2

$.fn.ignore = function(sel){ 
 
    return this.clone().find(sel||">*").remove().end(); 
 
}; 
 

 
function rebrand(el, word){ 
 
    if (!word.length && !el) return; 
 
    var $el = $(el), html = $el.ignore("script").html(), 
 
     rgx = new RegExp("(?![^<]+>)("+ word +")", "g"); 
 
    $el.html(html.replace(rgx, "<span class='brand'>$1</span>")); 
 
} 
 

 
$(function() { // DOM ready 
 

 
    // !!! IMPORTANT: REBRAND FIRST !!! 
 
    rebrand("body", "Brand Name"); 
 
    // so the following code will not break on lost events, data bindings etc... 
 

 
    // Other DOM ready code here like: 
 
    $("button").click(function(){ $(this).css({color:"red"}); }); 
 
    
 
}); 
 

 
// Other JS, jQ code here...
.brand{ 
 
    color: rgba(255,0, 100,0.4); 
 
    font: italic normal bold 1em/1 sans-serif; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div> 
 
    <h1>Title with Brand Name!</h1> 
 
    <p> 
 
    Change styles only to Brand Name!<br> 
 
    but don't mess with <a href="#">links to Brand Name are cool</a><br> 
 
    <button>Button with Brand Name works!</button> 
 
    </p> 
 
    <ul> 
 
    <li>Other Brand</li><li>Brand Name</li><li>Brandy</li> 
 
    </ul> 
 
</div> 
 
<div> 
 
    <h2>Subtitle <i>and italic Brand Name</i></h2> 
 
    <p>The HTML will not get messed cause of Brand Nameing<br> 
 
    Paragraph with a &lt;b&gt; tag <b>bold Brand Name actually</b></p> 
 
    <code>This is a code tag with a Brand Name :)</code> 
 
</div>

Kudos tới hai câu trả lời này:
jQuery.ignore Plugin
Highlight Words (Ignoring names of HTML tags)

1

Giải pháp của tôi là một chút khác biệt so với trước đó một nhưng trong trường hợp bất kỳ lúc nào cũng có giá trị, tôi giả định.

Trong sau chức năng của tôi jQuery:

function replaceBrand(brandName) { 
    $('body').find(":not(iframe)").contents().filter(function(index, element) { 
    if (element.nodeType == 3 && element.nodeValue.indexOf(brandName) != -1) { 
     var newInnerValue = element.nodeValue.replace(brandName, '<div><span class="brand">' + brandName + '</span></div>'); 
     $(element).replaceWith(newInnerValue); 
    } 
}); 

}

replaceBrand ('Tên thương hiệu', 'hoàn toàn mới');

2

nếu mã của bạn hoạt động, chỉ cần thêm một dòng tương tự như mã:

this.nodeValue.wrap("<span class='new'></span>"); 
3

Bạn có thể thay thế các textNodes với một đoạn văn bản. Điều này cho phép bạn nhóm văn bản và các nút được tạo kiểu và trao đổi nó với mã văn bản hiện có.

var x = 0; 
 
$("body *").contents().each(function() { 
 

 
    if (this.nodeType == 3 && this.parentElement.tagName != "SCRIPT") { 
 

 
    var text = this.nodeValue; 
 
    var i = 0, lastIndex = 0; 
 
    var search = /brandname/ig; 
 
    var result; 
 
    var parent = this.parentNode; 
 
    var textNode = null; 
 
    var highlight = null; 
 
    var textRange = ""; 
 
    var fragment = document.createDocumentFragment(); 
 

 
    // Do search 
 
    while ((result = search.exec(text)) !== null) { 
 
    
 
     // add plain text before match 
 
     textRange = text.substring(lastIndex, result.index); 
 
     if (textRange != '') { 
 
     textNode = document.createTextNode(textRange); 
 
     fragment.appendChild(textNode); 
 
     } 
 
     
 
     // add highlight elements 
 
     highlight = document.createElement('span'); 
 
     highlight.innerHTML = result[0]; 
 
     highlight.className = "hi"; 
 
     fragment.appendChild(highlight); 
 
     lastIndex = search.lastIndex; 
 
    } 
 

 
    // Add trailing text 
 
    textRange = text.substring(lastIndex); 
 
    if (textRange != '') { 
 
     textNode = document.createTextNode(textRange); 
 
     fragment.appendChild(textNode); 
 
    } 
 
     
 
    // Replace textNode with our text+highlight 
 
    if(fragment.children.length > 0) { 
 
     this.parentNode.replaceChild(fragment, this); 
 
    } 
 
    } 
 

 
});
span.hi { 
 
    background-color: #FFCC00; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p> 
 
    Hello world this is my brandname. The BrAnDNAMe is regex matched and we can change subelements like "<a href=''>Brandname</a>." It should not replace <b>elements</b> that don't match. 
 
</p>

1
var rgx_BRAND = /(foo)/ig; 
$("*") 
    .contents() 
    .filter(function() { 
     return this.nodeType === Node.TEXT_NODE && this.textContent.search(rgx_BRAND) > -1; 
    }) 
    .each(function(){ 
     var html = this.textContent.replace(rgx_BRAND, '<b class="-my-brand">$1</b>'); 
     $(this).before(html).remove(); 
    }); 

Hope this helps, Cheers

1

Đi từ đoạn mã của bạn:

$(function() { 
    var parent, needle = 'brandname', 
     regex = new RegExp(needle, 'g'); 
    $("body *").contents().each(function() { 
     if(this.nodeType==3 && ((parent = $(this.parentNode)).length > 0) { 
      parent.html(parent.html().replace(
       regex, '<span class="brand-name">' + needle + '</span>')); 
     } 
    } 
}); 

Nó có thể không phải là phương pháp hiệu quả nhất nhưng khá dễ dàng và có được của công việc được thực hiện trong các bài kiểm tra của tôi. Tìm kiếm thuộc tính parentNode sẽ hoạt động trong all browsers.

+1

hãy cẩn thận, điều này cũng sẽ thay thế bất kỳ tên lớp hoặc giá trị thuộc tính nào khác trong tên gốc phù hợp với tên thương hiệu. đây có thể là lý do tại sao nodeValue được sử dụng bởi OP. –

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