javascript - 使用 jquery 和/或 Rails JS 突出显示主题标签和@用户名

标签 javascript jquery ruby-on-rails

我在 Rails 和 jquery 上使用 ruby​​。

我正在尝试找到一种方法来注意到评论中的所有@...和#...。然后我想让它们链接到 http://www.example.com/user_profile/ ...或http://www.example.com/search/ ... 分别。

首先,我必须使用 jquery 动态查找注释中的所有 #... 和 @...。

所以,我使用下面的突出显示代码(不是我制作的):

/*

highlight v5

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e68c84a683878f89c885898b" rel="noreferrer noopener nofollow">[email protected]</a>>

*/

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';
    var middlebit = node.splitText(pos);
    var endbit = 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();
};

我可以找到像这样的单词

$('span').highlight('Word');

它有效

但我想突出显示所有开头有 @ 或 # 的单词,如下所示

$("span").highlight('/([#])([a-z])\w+/ig');
$("span").highlight('/([@])([a-z])\w+/ig');

但是上面的代码不起作用。

我愿意使用不同的库,并且愿意接受新的更高级别的建议。

最佳答案

您提到的插件不是为正则表达式构建的。它只能突出显示单个单词,没有任何自定义,仅此而已。

使用mark.js

mark.js你可以意识到你想做什么。它是一个文本荧光笔 – 用纯 JavaScript 编写,但也可作为 jQuery 插件 – 用于关键字/搜索词和自定义正则表达式。请查看website有关安装和 API 的详细信息。

如果您想突出显示自定义正则表达式,您需要这样调用它:

$(".context").markRegExp(/RegExp/gi);

使用您的代码进行演示:

JSFIDDLE DEMO

$(document).ready(function() {
  $(".context").markRegExp(/([@]|[#])([a-z])\w+/gmi);
});
mark {
  background: yellow;
}
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdn.rawgit.com/julmot/mark.js/6.1.0/dist/jquery.mark.min.js"></script>
<div class="context">
  Lorem ipsum @dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
  sanctus est Lorem ipsum dolor sit amet. #Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
  Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
</div>

注意:请不要像本示例中那样嵌入 mark.js。 “Rawgit.com”仅用于演示目的!

更新

顺便说一句:如果你想将匹配项转换为链接,你可以这样做:Demo !

关于javascript - 使用 jquery 和/或 Rails JS 突出显示主题标签和@用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420083/

相关文章:

javascript - Angularjs 使用的 Rails API

ruby-on-rails - Rails 推荐的添加示例数据的方法

javascript - d3 折线图任意线填充

javascript - jQuery 插件不会覆盖默认值

javascript - 点击链接触发事件

javascript - 为什么这个 jQuery 不向下滑动/显示隐藏(向上滑动)的元素?

ruby-on-rails - 从数组中提取多个键值属性

javascript - 扩展 JavaScript 命名空间

javascript - jQuery 倒数计时器不倒计时

javascript - 从内部函数返回外部函数