好的,我已经使用以下答案和评论中的改进代码更新了这个问题,更类似于真实项目。但它仍然无法在IE8中运行。 fiddle here
<ul id="definitions">
<li id="defid63">keyword1<input type="hidden" value="63" /></li>
<li id="defid61">keyword2<input type="hidden" value="61" /></li>
<li id="defid62">Keyword3<input type="hidden" value="62" /></li>
</ul>
<div id="html">Lorem ipsum keyword1 dolor keyword2 sit keyword3 amet, consectetur adipisicing elit, sed do eiusmod tempor</div>
我有一个关键字列表(ul > li
),并且有一个带有一些文字的字符串。我想用<a>
标签包装每个匹配关键字。我的代码在firefox和chrome中运行良好,但IE(8)与正则表达式不符合。
jQuery(function($) {
// created by Gracenotes
// http://goo.gl/MTkcY
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
};
var $node = $('#html'),
// the dom element
html = $node.html(); // the text we'll manipulate
$('#definitions li').each(function() {
var defid = $(this).find('input').val(),
deftext = $(this).html().split("<input")[0],
//the keyword
//pattern = eval('/\\b('+RegExp.quote(deftext)+')\\b/gi');
pattern = new RegExp('\\b(' + RegExp.quote(deftext) + ')\\b', 'gi');
html = html.replace(pattern, '<a href="#id=' + defid + '">$1</a>');
});
// replace the dom content with our updated text
$node.html(html);
});
答案 0 :(得分:2)
答案 1 :(得分:1)
这适用于IE 8; test it in this fiddle。
这就是我的所作所为:
这是代码
jQuery(function($) {
// created by Gracenotes
// http://goo.gl/MTkcY
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
};
var $node = $('#html'), // the dom element
html = $node.html(); // the text we'll manipulate
$('#definitions li').each(function() {
var $this = $(this),
//I didn't know where defid came from
//so I just added it as id attribute
defid = $this.attr('id'),
deftext = $(this).text(), //the keyword
pattern = new RegExp('\\b(' + RegExp.quote(deftext) + ')\\b', 'gi');
html = html.replace(pattern, '<a href="#id=' + defid + '">$1</a>');
});
// replace the dom content with our updated text
$node.html(html);
});
答案 2 :(得分:0)
好的,实际问题在于我在问题的第一个版本中没有提供的代码。我使用了代码deftext = $(this).html().split("<input")[0]
,它在IE8中不起作用,因为IE将标签更改为大写字符。像FF和Chrome这样的浏览器不会这样做。因此,使用eval()来创建表达式确实有效,并不是真正的问题:这里演示http://jsfiddle.net/zluiten/79rhW/