2017-01-27 63 views
4

我想在文本中檢測的字符,如果發現包裹在一個HTML元素之前的單詞,並刪除字符。之前如何檢測詞「:」和「跨度」包裝使用jQuery?

實施例:

Case: 

變得

<span class="th">Case</span> 

方法

我可以利用檢測的:存在:

if (str.indexOf(':') > -1) 

要我使用之前獲得了這個詞:

var th = str.split(':')[0]; 

要在我嘗試過的元素包裹着一句話:

var th_wrap = "<span class='th'></span>"; 
$(th).wrap(th_wrap); 

不工作。 要刪除:我想:

th.replace(':', ''); 

這也不起作用。

要稍微複雜一點,我要趕的someword:任何次數,而不只是第一個。

我會很感激任何指針,歡呼聲。 (JavaScript或jQuery的)

代碼片段

var str = $('.target').html(); 
 
if (str.indexOf(':') > -1) { 
 
    var th = str.split(':')[0]; 
 
    th.replace(':', ''); 
 
    var th_wrap = "<span class='th'></span>"; 
 
    $(th).wrap(th_wrap); 
 
}
th { font-weight: bold; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p class="target"> 
 
    Case 1: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
    <br /> 
 
    <br />Case 2: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
</p>

+0

必須是一個DOM元素。不是一個字符串。 如果你試圖用你想要的''代替第一個case,最好是得到'.target'的第一個孩子並替換它。 – Mojtaba

回答

5

在你的情況的話案例1:案例2:是文本節點。

所以,你需要獲得下目標所有節點:對於這一點,使用jQuery.contents()

的片段:

$('.target').contents().each(function(idx, ele) { 
 
    if (ele.nodeType == Node.TEXT_NODE && 
 
      ele.textContent.indexOf(':') > -1) { 
 
    ele.textContent = ele.textContent.replace(':', ''); 
 
    $(ele).wrap($('<span/>', { 
 
     class: 'th' 
 
    })); 
 

 
    } 
 
});
.th { 
 
    font-weight: bold; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<p class="target"> 
 
    Case 1: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
    <br /> 
 
    <br />Case 2: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
</p>

+0

這段代碼如何知道在':'之前要包裝什麼?例如,「案例2」 - 爲什麼它不會在「案例」之前包裝單詞? – sol

+1

因爲在「案例2」之前有一個標籤(br)。如果,而不是你的格式更改,你可能總是使用正則表達式。在任何情況下,這種方法都可以讓你只對textNode起作用。 – gaetanoM

2

您可以使用正則表達式來做好這項工作。使用jQuery .html(function)改變P的HTML。在回調函數使用String.prototype.replace()包裹目標字符串中的跨度。

$("p").html(function(i, html){ 
 
    return html.replace(/(\w+\s\d+):/g, "<span class='th'>$1</span>"); 
 
});
.th { color: red }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p class="target"> 
 
    Case 1: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
    <br /> 
 
    <br />Case 2: 
 
    <br />some text 
 
    <br />some more text 
 
    <br />even more text 
 
</p>

+0

如果br標籤不存在,此方法是否可行? – sol

+1

@ovokuro是的,請參閱https://jsfiddle.net/06oe5gn3/。如果br或任何其他元素存在或不存在於p。 – Mohammad

+0

謝謝。如果在'案件'之前另一個詞存在的情況發生,那麼它不起作用。 https://jsfiddle.net/sol_b/xpwbdzqg/1/ ---如果沒有br,你的解決方案對我來說很好,但如果有多餘的話,另一種解決方案會更好!我將不得不尋求妥協。謝謝你的幫助 – sol

相關問題