JavaScript window.find()不选择搜索词 [英] JavaScript window.find() does not select search term
问题描述
当我尝试传递遍布几个块元素的文本时,window.find方法开始工作:
HTML :
<!DOCTYPE html>
< html>
< head>
< meta charset = utf-8 />
< / head>
< body>
< p>搜寻我< / p>< b>我可以回答< / b>
< / body>
< / html>
JavaScript :
window.find(meI could be);
或者:
str =me;
str + =\\\
;
str + =我可能是t;
window.find(str);
当 编辑: 我可以使它更简单吗? (更好)? 注意:没有jQuery(只有Raw JS)。 < p>
元素存在于搜索词语之间。
最终结果应该是页面文本中的GUI选择,我不想搜索它是否存在。 我想知道如何在Firefox(至少)和Internet Explorer中实现这一点。
注意:我无法更改(例如更改为内联显示)。
这是我在@Alexey Lebedev的评论后尝试,但它也发现脚本(标签文本):
$ b $ pre $ 函数nativeTreeWalker(startNode){
var walker = document.createTreeWalker(
startNode ,
NodeFilter.SHOW_TEXT,
null,
false
);
var node;
var textNodesV = [];
var textNodes = [];
node = walker.nextNode(); (节点){
if(node.nodeValue.trim()){
textNodes.push(node);
while(node)
textNodesV.push(node.nodeValue);
//console.log (node.nodeValue);
}
node = walker.nextNode();
}
return [textNodes,textNodesV];
}
var result = nativeTreeWalker(document.body);
var textNodes = result [0];
var textNodesV = result [1];
var param =Praragraph.Test 3 Praragr;
paramArr = param.split(/(?= [\S])(?!\s)(?= [\W])(?= [\S])/ g);
//为(i = 0; i< paramArr.length-1; i ++){
paramArr [i] = paramArr [i] + paramArr [i + 1]修正分割PARAM
.charAt(0);
paramArr [i + 1] = paramArr [i + 1] .substring(1,paramArr [i + 1] .length);
}
//修正最后一个元素PARAM
if(paramArr [paramArr.length-1] ===){
paramArr.splice(paramArr.length-1, 1);
}
//console.log(paramArr);
var startNode,startOffset,sFound = false,
endNode,endOffset; (j = 0; j
的
(i = 0; i
if(pos!= -1){
if(!sFound){
startNode = textNodes [j];
startOffset = pos;
sFound = true;
} else {
endNode = textNodes [j];
endOffset = pos + paramArr [i] .length;
break;
}
}
}
}
console.log(startNode);
console.log(startOffset);
console.log(endNode);
console.log(endOffset);
var range = document.createRange();
range.setStart(startNode,startOffset);
range.setEnd(endNode,endOffset);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
如果您希望在IE< 9,你需要添加特定于MS的选择代码(噩梦),或者使用Rangy.js(非常重)。
函数visibleTextNodes(){
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ALL,
function(node){
if(node.nodeType == 3){
return NodeFilter.FILTER_ACCEPT;
} else if(node.offsetWidth&& node.offsetHeight&& node.style.visibility!='hidden'){
return NodeFilter.FILTER_SKIP;
} else {
return NodeFilter.FILTER_REJECT;
}
},
false
); ();
for(var nodes = []; walker.nextNode();){
nodes.push(walker.currentNode);
}
返回节点;
}
//找到第一个匹配项,选择并滚动到它。
//不区分大小写的情况。
//为了更好地滚动选择,请参阅https://gist.github.com/3744577
函数高亮(针){
needle = needle.replace(/ \s / g, '').toLowerCase();
var textNodes = visibleTextNodes(); (var i = 0,texts = []; i texts.push(textNodes [i] .nodeValue.replace(/ \ s / g,'').toLowerCase());
}
var matchStart = texts.join('')。indexOf(needle);
if(matchStart< 0){
return false;
var nodeAndOffsetAtPosition = function(position){
for(var i = 0,consume = 0; consume + texts [i] .length< position; i ++) {
消费+ =文本[i] .length;
var whitespacePrefix = textNodes [i] .nodeValue.match(/ ^ \s * /)[0];
return [textNodes [i],position - consume + whitespacePrefix.length];
};
var range = document.createRange();
range.setStart.apply(range,nodeAndOffsetAtPosition(matchStart));
range.setEnd.apply(range,nodeAndOffsetAtPosition(matchStart + needle.length));
window.getSelection()。removeAllRanges();
window.getSelection()。addRange(range);
range.startContainer.parentNode.scrollIntoView();
}
highlight('hello world');
When I try to pass text which spreads throughout a few block elements the window.find method dosent work:
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
</head>
<body>
<p>search me</p><b> I could be the answer</b>
</body>
</html>
JavaScript:
window.find("meI could be");
Or:
str = "me";
str+= "\n";
str+="I could be t";
window.find(str);
This happens when the <p>
element is present between the search term.
The end result should be a GUI selection on the text in the page, I do not want to search if it exists.
I would like to know how to achieve this in Firefox(at least) and internet explorer.
Note: I can't change the dom (e.g. change to display inline).
Edit:
Here is something I tried after @Alexey Lebedev's comment, but it also finds the script (tag [...] text):
Can I make it more simple? (better)?
function nativeTreeWalker(startNode) {
var walker = document.createTreeWalker(
startNode,
NodeFilter.SHOW_TEXT,
null,
false
);
var node;
var textNodesV = [];
var textNodes = [];
node = walker.nextNode();
while(node ) {
if(node.nodeValue.trim()){
textNodes.push(node);
textNodesV.push(node.nodeValue);
//console.log(node.nodeValue);
}
node = walker.nextNode();
}
return [textNodes,textNodesV];
}
var result = nativeTreeWalker(document.body);
var textNodes = result[0];
var textNodesV = result[1];
var param = " Praragraph.Test 3 Praragr";
paramArr = param.split(/(?=[\S])(?!\s)(?=[\W])(?=[\S])/g);
//Fix split PARAM
for(i=0;i<paramArr.length-1;i++){
paramArr[i]= paramArr[i]+paramArr[i+1].charAt(0);
paramArr[i+1] = paramArr[i+1].substring(1,paramArr[i+1].length);
}
//Fix last element PARAM
if(paramArr[paramArr.length-1] === ""){
paramArr.splice(paramArr.length-1,1);
}
//console.log(paramArr);
var startNode,startOffset,sFound=false,
endNode,endOffset;
for(i=0;i<paramArr.length;i++){
for(j=0;j<textNodesV.length;j++){
//Fully Equal
var pos = textNodesV[j].indexOf(paramArr[i]);
if(pos != -1){
if(!sFound){
startNode = textNodes[j];
startOffset = pos;
sFound=true;
}else{
endNode = textNodes[j];
endOffset = pos+paramArr[i].length;
break;
}
}
}
}
console.log(startNode);
console.log(startOffset);
console.log(endNode);
console.log(endOffset);
var range = document.createRange();
range.setStart(startNode,startOffset);
range.setEnd(endNode,endOffset);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
Note: No jQuery (only Raw JS).
JS Bin demo: http://jsbin.com/aqiciv/1/
If you want this to work in IE < 9 you'll need to add MS-specific selection code (nightmare), or use Rangy.js (pretty heavy).
function visibleTextNodes() {
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ALL,
function(node) {
if (node.nodeType == 3) {
return NodeFilter.FILTER_ACCEPT;
} else if (node.offsetWidth && node.offsetHeight && node.style.visibility != 'hidden') {
return NodeFilter.FILTER_SKIP;
} else {
return NodeFilter.FILTER_REJECT;
}
},
false
);
for (var nodes = []; walker.nextNode();) {
nodes.push(walker.currentNode);
}
return nodes;
}
// Find the first match, select and scroll to it.
// Case- and whitespace- insensitive.
// For better scrolling to selection see https://gist.github.com/3744577
function highlight(needle) {
needle = needle.replace(/\s/g, '').toLowerCase();
var textNodes = visibleTextNodes();
for (var i = 0, texts = []; i < textNodes.length; i++) {
texts.push(textNodes[i].nodeValue.replace(/\s/g, '').toLowerCase());
}
var matchStart = texts.join('').indexOf(needle);
if (matchStart < 0) {
return false;
}
var nodeAndOffsetAtPosition = function(position) {
for (var i = 0, consumed = 0; consumed + texts[i].length < position; i++) {
consumed += texts[i].length;
}
var whitespacePrefix = textNodes[i].nodeValue.match(/^\s*/)[0];
return [textNodes[i], position - consumed + whitespacePrefix.length];
};
var range = document.createRange();
range.setStart.apply(range, nodeAndOffsetAtPosition(matchStart));
range.setEnd.apply( range, nodeAndOffsetAtPosition(matchStart + needle.length));
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
range.startContainer.parentNode.scrollIntoView();
}
highlight('hello world');
这篇关于JavaScript window.find()不选择搜索词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!