是否可以在Safari/Firefox/Chrome中使用Javascript来搜索给定文本字符串的特定div容器。我知道你可以使用window.find(str)
搜索整个页面,但是可以将搜索区域限制为div吗?如何限制Javascript的window.find到一个特定的DIV?
谢谢!
是否可以在Safari/Firefox/Chrome中使用Javascript来搜索给定文本字符串的特定div容器。我知道你可以使用window.find(str)
搜索整个页面,但是可以将搜索区域限制为div吗?如何限制Javascript的window.find到一个特定的DIV?
谢谢!
一旦你看看你的div
(你可以通过document.getElementById
或任何其他DOM功能,various specs here做),你可以使用textContent
或innerText
发现div
的文本。然后你可以使用indexOf
找到那个字符串。
或者,在较低级别上,您可以使用递归函数搜索窗口中的所有文本节点,其中听起来比现在复杂得多。基本上,你的目标div
(这是一个Element
)开始,您可以遍历其childNodes
和搜索他们nodeValue
字符串(如果他们Text
S)或递归到他们(如果他们Element
S)。
的诀窍是一个天真的版本将无法找到"foo"
在此标记:
<p><span>fo</span>o</p>
...既然两种Text
节点的存在有它"foo"
一个nodeValue
(其中一人有其他"o"
)。
也许你正在试图不使用jquery ......但是如果没有,你可以使用这个$('div:contains(whatyouarelookingfor)')
唯一的问题是它可能会返回父元素,它也包含了匹配的子div。
根据其他答案,您将无法使用window.find
功能。好消息是,你不必自己编写程序,因为现在有一个名为rangy的库,这对此有很大的帮助。所以,因为代码本身有点太复杂了,所以我只会参考一个rangy库的代码示例,它可以是found here。展望中的代码,你会发现
searchScopeRange.selectNodeContents(document.body);
,你可以用
searchScopeRange.selectNodeContents(document.getElementById("content"));
替换要在内容DIV唯一专门搜索。
var elements = [];
$(document).find("*").filter(function() {
if($(this).text().contains(yourText))
elements.push($(this));
});
console.log(elements);
我没有尝试它,但根据jQuery文档它应该工作。
根据你正在尝试做什么,有一个有趣的方式做到这一点,确实工作(确实需要一些工作)。
首先,搜索从用户上次点击的位置开始。所以为了得到正确的上下文,你可以强制点击div。这会将内部指针放置在div的开头。
然后,您可以像平常一样使用window.find来查找元素。它将突出显示并移向找到的下一个项目。您可以创建自己的对话框并处理查找返回的真或假,以及检查位置。因此,例如,您可以保存当前的滚动位置,并且如果下一个返回的结果在div之外,则可以恢复滚动。另外,如果它返回false,那么你可以说没有找到结果。
您也可以显示默认搜索框。在这种情况下,您可以指定起始位置,但不能指定结束位置,因为您失去了控制权。
帮助您入门的一些示例代码。如果有足够的兴趣,我也可以尝试搭建一个jsfiddle。
语法:
window.find(aStringToFind, bCaseSensitive, bBackwards, bWrapAround, bWholeWord, bSearchInFrames, bShowDialog);
例如,要启动myDiv内搜索,尝试
document.getElementById("myDiv").click(); //Place cursor at the beginning
window.find("t", 0, 0, 0, 0, 0, 0); //Go to the next location, no wrap around
你可以设置一个模糊(失焦)事件处理程序,让你知道当你离开div,所以你可以停止搜索。
要保存当前的滚动位置,请使用document.body.scrollTop。如果它试图跳到div之外,则可以将其设置回来。
希望这会有所帮助! 〜techdude
我应该补充说,这可以在firefox/chrome /苹果浏览器。 – techdude 2014-09-05 19:52:14
这里怎么我做与jQuery是:
var result = $('#elementid').text().indexOf('yourtext') > -1
它会返回true或false
实际上,我期待复制浏览器发现功能(该字符串将被突出显示,并一旦再次点击搜索,它会继续下去Div内的下一场比赛,等等)。 – VeePee 2013-02-28 18:11:38
@VeePee:恐怕你得编写它(这可能只是一个真正的痛苦),即使'window.find'也不是标准化的。但是,这又有可能,因为你可以在'Text'节点中找到文本,用突出的'span'等来分割该节点以包围它。 – 2013-02-28 18:12:47