如何检查什么是相邻字符
How to check what are adjacent characters?
我正在创建一个降价编辑器,我需要检查相邻字符是否是特定字符,然后删除它们,否则附加它们。
例如,我想检查所选文本,拖曳相邻字符**
,然后删除它们,否则将它们附加到所选文本周围。
我可以使用此方法获取选定的文本:
function getSelection(elem) {
var selectedText;
if (document.selection != undefined) { // IE
elem.focus();
var sel = document.selection.createRange();
selectedText = sel.text;
} else if (elem.selectionStart != undefined) { // Firefox
var startPos = elem.selectionStart;
var endPos = elem.selectionEnd;
selectedText = elem.value.substring(startPos, endPos)
}
return selectedText;
}
$(document).on('mousedown', 'button', function(e) {
var selection = getSelection( $('#txtarea').get(0) );
alert(selection);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="txtarea">this is a test</textarea>
<button>Bold (toggle)</button>
现在我需要当用户单击该按钮时,它会检查所选文本是否在**
之间,就像这样**selectedtext**
,然后像这样删除它们selected text
否则像这样附加它们**selectedtext**
。我该怎么做?
我想参考所有的降价编辑器:https://www.google.de/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=javascript%20markdown%20library
所以:不要试图重新发明轮子,等等。
但为了学习,我的方法看起来像这样:
function toggleMarker(marker, el) {
var markerLength = marker.length;
var startPos, endPos, selection, range;
if (document.selection != undefined) { // IE
el.focus();
range = document.selection.createRange();
selection = range.text;
} else if (el.selectionStart != undefined) { // Firefox
startPos = el.selectionStart;
endPos = el.selectionEnd;
selection = el.value.substring(startPos, endPos);
}
if (!selection.length){
return;
}
if (el.value.substring(startPos-markerLength,startPos) === marker
&& el.value.substring(endPos,endPos+markerLength) === marker
){
el.value = el.value.substring(0,startPos-markerLength) +
selection +
el.value.substring(endPos+markerLength);
}
else{
el.value = el.value.substring(0,startPos) + marker +
selection + marker + el.value.substring(endPos);
}
}
$(document).on('mousedown', 'button', function(e) {
toggleMarker( $(this).data('marker'), $('#txtarea').get(0) ).text;
});
查看实际操作:https://jsfiddle.net/t4ro53v8/4/
该解决方案采用非常通用的方法:将要切换的标记设置为自定义数据属性,以便于重用代码。
该功能仅适用于非 IE 情况。您必须检查如何确定IE中某个范围的startPos和endPos。
在所有其他浏览器中:
- 所选内容已确定
- 如果未选择任何内容,则不执行任何操作
- 根据给定的标记检查所选内容的四舍五入
- 如果两个标记都存在,它们将被删除
- 否则插入标记
作为概念证明,此示例就像一个魅力。但也有一些缺点:
- 如何区分粗体文本(**)和斜体(*)?
- 如何处理仅出现在所选内容一侧的标记
- 如果选择了标记,该怎么办?
但这是由你现在解决的...
您可以使用正则表达式来查找 ** ** 模式的出现。此正则表达式将帮助您找到与您拥有的模式相似的模式。
[*][*][a-z]*[*][*]
.
使用 exec()
方法将帮助您提取该特定文本。
使用 .length
检查它的长度,如果是 4,则中间没有任何东西,您可以将其替换为**
包围的新文本,
"**"+ newtext+"**"
要删除 **,您可以使用 replace()
方法,将**
替换为空格左右。
- 匹配某个字符后所有文本的正则表达式是什么
- 逃离这些字符的目的是什么?[来自Javascript和JQuery书]
- 带有前导散列字符的ajax提交的目的是什么
- JavaScript意外的令牌<,有什么方法可以逃避错误(或至少跳过那些无用的字符)
- 使用JS找出字符串中字符重复的最简单方法是什么
- 通过字符串最有效的方法是什么;s字符
- 在Javascript中下划线字符(_)的用途是什么
- regex某个字符可以存在也可以不存在,但之后什么都没有
- 什么是“@"ecmascript 6中的字符平均值
- 将字符串解析为一系列转义十六进制字符的方法是什么
- 什么是默认的 JavaScript 字符编码
- 需要使用什么正则表达式将内容插入某些字符的第 n 次出现之间
- 在MySQL,PHP或一般情况下排序时字符的优先级是什么
- jQuery中的“#”字符(数字符号)是什么意思?
- 我什么时候需要转义正则表达式字符集中的字符(在 [] 内)
- 对 URI 组件非 utf-8 字符进行编码并相应地解码它们的正确方法是什么
- 在 JavaScript 字符串数组中获取相邻字符的最佳方法是什么?
- “!” 字符在 nodejs 模块名称中有什么作用
- JavaScript中(字符空间字符)或(空格字符空格)的表达式是什么
- AngularJS中$interpolate内字符串的转义字符是什么