2011-05-04 68 views
13

我最近看到很多庫用於在HTML頁面中搜索和突出顯示術語。然而,我看到的每個圖書館都有同樣的問題,他們無法找到部分包含在html標籤中的文本,或者他們無法找到特殊字符,這些字符是& -expressed。HTML中的全文搜索忽略標籤/&


例一:

<span> This is a test. This is a <b>test</b> too</span> 

搜索 「測試」 將發現的第一個實例而不是第二。


實施例b:

<span> Pencils in spanish are called l&aacute;pices</span> 

在搜索 「lápices」 或 「lapices」 將不能產生一個結果。


是否有JS庫這樣做或至少有一種方法來規避這些障礙?

在此先感謝!

布魯諾

+0

嘗試[mark.js(https://markjs.io)它有一個選項'acrossElements' – dude 2017-02-09 07:16:43

回答

30

您可以在IE中使用非IE瀏覽器中的window.find()TextRangefindText()方法。這裏有一個例子:

http://jsfiddle.net/xeSQb/6/

不幸的是歌劇之前切換到眨眼渲染引擎在15版本不支持任何window.findTextRange。如果這是一個關心你,一個相當重量級的替代方案是使用我Rangy庫的TextRangeCSS class applier模塊的組合,如下面的演示:http://rangy.googlecode.com/svn/trunk/demos/textrange.html

代碼:

function doSearch(text) { 
    if (window.find && window.getSelection) { 
     document.designMode = "on"; 
     var sel = window.getSelection(); 
     sel.collapse(document.body, 0); 

     while (window.find(text)) { 
      document.execCommand("HiliteColor", false, "yellow"); 
      sel.collapseToEnd(); 
     } 
     document.designMode = "off"; 
    } else if (document.body.createTextRange) { 
     var textRange = document.body.createTextRange(); 
     while (textRange.findText(text)) { 
      textRange.execCommand("BackColor", false, "yellow"); 
      textRange.collapse(false); 
     } 
    } 
} 
+0

工作就像一個魅力。如果有多個結果,範圍迭代可能會有點慢,但我認爲這不是一個主要問題,再加上它確實是我需要的。太棒了。 – Bruno 2011-05-04 19:36:14

+1

此代碼中的一個(非常)小缺陷是它從當前光標位置向前搜索,所以如果用戶突出顯示一段文本並單擊該按鈕,則搜索將在用戶突出顯示後開始。理想情況下,在find()調用之前,應該有某種調用將光標移動到頂部。 – Bruno 2011-05-04 20:16:33

+0

@布魯諾:好點。我現在補充說... – 2011-05-04 21:35:44

0

這裏有2個問題。一個是嵌套的內容問題,或者搜索跨越元素邊界的匹配。另一個是HTML轉義字符。

處理HTML轉義字符的一種方法是,例如,如果您使用jQuery,請使用.text()方法,然後對其執行搜索。從那裏回來的文字已經將逃脫的角色「翻譯」成他們的真實角色。

處理這些特殊字符的另一種方法是用轉義版本替換實際字符(在搜索字符串中)。但是,由於存在各種各樣的可能性,這可能是一個漫長的搜索取決於實施。

可以使用相同種類的「文本」方法來查找跨越實體邊界的內容匹配。它變得更加棘手,因爲「文本」沒有任何關於內容的實際部分來自何處的概念,但是如果您鑽入內容,它會爲您提供一個較小的搜索範圍。一旦您關閉,就可以切換到更多的「一系列字符」排序搜索而不是基於單詞的搜索。

但是我不知道任何這樣做的庫。

-2

只需按F3並使用<p></p>命令告訴您的站點上的其他人。 例如:你有F3搜索按鈕的知識,以便把文字在屏幕上,告訴別人你可以鍵入..

<p><h4>If your having trouble finding something press F3 to highlight the text<h4></p>