gpt4 book ai didi

javascript - 使用 jQuery 突出显示搜索字符串

转载 作者:行者123 更新时间:2023-12-03 02:38:34 25 4
gpt4 key购买 nike

我在这里使用代码: http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

要创建突出显示搜索功能,但是代码似乎对短语进行了双重换行,如下所示:

<span class="highlight" tabindex="0"><span class="highlight" tabindex="0">Test</span></span>

谁能看到我错过了什么,我一整天都在做这个,我想我快疯了。预先感谢:)

调用hightlight函数的代码为:

<script>
$( document ).ready(function() {
$('.highlightable').removeHighlight().highlight('<?php echo $search['query'] ?>');
<?php if ($search['query']) { ?>
var n = $(".highlightable").find("span.highlight").length;
if (n == 0) {
alert('There are no search results for <?php echo $search['query'] ?>. Please try again.');
} else {
alert('There are ' + n + ' search results for <?php echo $search['query'] ?>. Use TAB key to move between results.');
}
<?php } ?>
});
</script>

然后是函数本身:

jQuery.fn.highlight = function(pat) {
function innerHighlight(node, pat) {
var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
pos -= (node.data.substr(0, pos).toUpperCase().length - node.data.substr(0, pos).length);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'highlight';
spannode.tabIndex = '0';
var middlebit = node.splitText(pos);
middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
}
else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
for (var i = 0; i < node.childNodes.length; ++i) {
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.length && pat && pat.length ? this.each(function() {
innerHighlight(this, pat.toUpperCase());
}) : this;
};

jQuery.fn.removeHighlight = function() {
return this.find("span.highlight").each(function() {
this.parentNode.firstChild.nodeName;
with (this.parentNode) {
replaceChild(this.firstChild, this);
normalize();
}
}).end();
};

完成:

<script>
$( window ).on( "load", function() {
$('.highlight').first().focus();
});
</script>

最佳答案

您遇到的问题必须与您使用代码的环境有关,而不是代码本身。正如您在下面的代码片段中看到的,该函数按预期工作,将匹配的单词包装一次。

片段:

/* ----- JavaScript ----- */
var div = $("div");

function highlight () {
div.highlight("expected");
console.log(div.html());
}

function dehighlight () {
div.removeHighlight();
console.log(div.html());
}
<!----- HTML ----->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//pastebin.com/raw/6zePUJr1"></script>
<style>span.highlight {background-color: #FFFF77}</style>

<button onclick="highlight()">Highlight</button>
<button onclick="dehighlight()">Dehighlight</button>
<div>The code works as expected.</div>

<小时/>

更新:

如前所述,highlightremoveHighlight 都不是问题的原因,如上面的代码片段所示。问题也不在于您提供的附加代码(在 $(document.ready) 函数内)。

相反,问题在于您将类 highlightable 赋予了两个元素(下面的),其中前者是后者:

  • 第一个是main.small-12.medium-8.columns.highlightable
  • 第二个是div.sections.highlightable

基于上述,在 $(".highlightable") 上调用 highlight 函数的含义是搜索短语是双重换行的。首先,它作为第一个元素的后代进行包装,然后再次包装,因为它也是第二个元素的后代。

您可以通过在控制台中输入 $(".highlightable").removeHighlight() 轻松识别这一点。您会注意到,不仅突出显示被删除,整个短语也被删除。

另外,请查看以下代码片段。它使用 highlightable 类的方式与您在代码中使用它的方式相同,这会导致搜索短语双重包装,就像您遇到的情况一样。

代码片段(错误):

/* ----- JavaScript ----- */
var highlightable = $(".highlightable");
highlightable.highlight("expected");
console.log(highlightable.last().html());
<!----- HTML ----->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//pastebin.com/raw/6zePUJr1"></script>
<style>span.highlight {background-color: #FFFF77}</style>

<div class = "highlightable">
<p class = "highlightable">
The code doesn't work as expected.
</p>
</div>

解决方案:

要解决双重换行问题,您必须从上述元素之一中删除 highlightable 类。如果这不是一个选项,您始终可以只使用 jQuery 对象中的第一个元素:

$('.highlightable').first().removeHighlight().highlight('<?= $search['query'] ?>');

关于javascript - 使用 jQuery 突出显示搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48432181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com