您好我需要为contentEditable div中的一些文本着色。假设我需要用蓝色突出显示+
。在keyup事件中,我按照$textarea.html($textarea.html().replace((/-/))/g,"<span class='blue'>$1</span>")
进行操作
替换的明显问题不止一次触发了stirng的同一部分(因为我有keyup事件)。我只能使用那种类型的事件键盘事件。这该怎么做?感谢
UPD *
也许我不清楚描述我的问题。我打字' - '然后继续输入- asdasdad
。问题是每个字母后的keyup事件触发(这是必须的),所以我得到太多的跨度,因为' - '总是在字符串中。
答案 0 :(得分:2)
你可以尝试的一件事是消极的前瞻,比如:
$textarea.html($textarea.html().replace((/-(?!<\/span>/))/g,"<span class='blue'>$1</span>")
匹配任何“ - ”后面没有“&lt; / span&gt;”。在替换特定短划线一次后,它不应该在下一个键盘上被替换。这是一个黑客,授予,但我认为它满足您的要求。
答案 1 :(得分:2)
因为javascript不支持lookbehind断言,所以可以执行以下操作:
var str = 'abc-def-xyz';
str = str.replace(/(<span class='blue'>)?-(<\/span>)?/g, function($0,$1,$2){ return $1?$0:"<span class='blue'>-</span>";});
<强>输出:强>
abc<span class='blue'>-</span>def<span class='blue'>-</span>xyz
即使你多次运行它。
答案 2 :(得分:0)
也许您可以更轻松地使用:http://codemirror.net/并为您的环境编写自定义模式。
答案 3 :(得分:0)
如果我正确理解了这个问题,你想在jQuery keyup
事件中运行某个正则表达式替换,但这只是第一次。您可以使用one()
来使事件处理程序在首次调用后解除绑定。
$(document).ready(function() {
var $textarea = ...
$('#somewhere').one('keyup', function() {
$textarea.html($textarea.html().replace('-', "<span class='blue'>-</span>"));
});
});