【问题标题】:substring selector with jquery?带有 jquery 的子字符串选择器?
【发布时间】:2013-11-18 22:52:37
【问题描述】:

是否可以使用 jquery 仅选择字符串的一部分?例如我有一个文本

<p>Metuentes igitur idem latrones Lycaoniam magna parte campestrem</p>

所以现在如果用户搜索一个字符串,我希望它被突出显示(例如我们使用粗体标签)

<p>Metuentes igitur idem latrones <b>Lycaoniam</b> magna parte campestrem</p>

如果需要,我们可以恢复到原始字符串。

  1. 第一个问题是我们是否可以使用jQuery选择这样的子字符串,并使用诸如.css()之类的jQuery方法将样式应用于该元素。
  2. 第二个问题是如果我们没有这样的选择器,我们如何使用jQuery或javascript通过字符串操作来实现它

谢谢。

更新

感谢大家的努力。这是一个小程序,我正在寻找的最终结果http://jsfiddle.net/TPg9p/3/Cheers!

【问题讨论】:

  • 我不认为 jQuery 可以选择子字符串,因为它不是 html 元素。您可以选择 p 元素,然后使用 .html() 获取当前字符串,在 JavaScript 中操作该字符串,在需要的地方添加 标记,然后再次使用 .html 设置 p 的 html。 html(newHtmlVariable).

标签: javascript jquery


【解决方案1】:

如果您知道要搜索的元素:

var string = "Lycaoniam";
var e = $("elementSelector"); // put here your selector
e.html(e.html().replace(new RegExp(search, "gi"), "<b>"+search+"</b>"));

对于更多元素,只需遍历它们并进行替换。要制作可切换样式,我会使用自定义类:

 e.html(e.html().replace(new RegExp(search, "gi"), "<span class='highlight'>"+search+"</span>"));

并使用以下命令将其删除:

$(".highlight").contents().unwrap();

.contents().unwrap() 不仅可以剥离类(必须相应地设置样式),还可以剥离标签。

【讨论】:

  • +1 用于使用展开技巧。我们不需要存储原始值!
  • 是的,但我犯了一个错误,我的代码只会替换第一次出现。现在使用 RegExp 应该没问题 :)
  • 这在给定的情况下有效,但如果搜索字符串包含正则表达式字符串,则会失败
【解决方案2】:

纯 jQuery 无法做到这一点。你可以这样做:

var search = 'Lycaoniam';
var orig = $('p').html();
var highlighted = orig.replace(new RegExp(
    search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi'
), '<b>$&</b>');
$('p').html(highlighted);

要恢复到原始文本:

$('p').html(orig);

search.replace(...) 部分允许处理特殊字符:http://jsfiddle.net/wared/TPg9p/

【讨论】:

【解决方案3】:

根据这里的答案:Wrap around part of text inside an element

您可以执行以下操作:

$('p').html(function(index, oldHtml){
   return oldHtml.replace(/(amet)/g, '<span>$1</span>');
});

http://jsfiddle.net/YxMvq/

【讨论】:

  • 不,那不是字符串选择器。你不明白我的问题
  • 这在给定的情况下有效,但如果搜索字符串包含正则表达式字符串,则会失败
【解决方案4】:

搜索文本并替换文本。

HTML:

<p id="mainText">Metuentes igitur idem latrones Lycaoniam magna parte campestrem</p>
<input type="text" id="inputTextBox" />
<input type="button" id="findButton" value="Find" />

jQuery :

$("#findButton").click(function(){
    var inputText = $("#inputTextBox").val();
    var mainText = $("#mainText").text();
    var updatedText = "<b>" + inputText + "</b>";
    mainText = mainText.replace(inputText, updatedText);
    $("#mainText").html(mainText);
});

Demo

【讨论】:

  • 这将只替换第一次出现。
【解决方案5】:

你知道 HTML 是什么时候创建的你想要哪个词吗?然后我建议改为执行以下操作

<p>Metuentes igitur idem latrones <span class="js-highlightable">Lycaoniam</span> magna parte campestrem</p>`

现在,如果您想突出显示它,就这样做

$(".js-highlightable").toggleClass("highlighted"); 

任何样式都可以在highligthed 类中定义。如果您希望能够仅将更改应用于单个元素而不是具有js-highlightable 类的所有元素,您也可以使用id 作为跨度。

【讨论】:

  • 我们事先不知道用户正在搜索哪个字符串,所以提前在单词周围加上 span 是没有用的
  • 另外,toggleClass 会移除类而不是跨度。如果我理解了 OP 的意图,跨度不应在一开始就出现。我在上面发布了我认为更好的解决方案。
  • 没错,我的解决方案是基于事先知道应该能够突出显示哪些元素。如果其他人在我的解决方案适用的情况下遇到类似问题,我将在此处留下答案。
猜你喜欢
  • 2011-01-30
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多