5

我想在使用 javascript 在 textarea 中输入垂直条 (|) 后立即将其替换为梵文 Danda (।)。

首先,我尝试了如何更改在 Firefox 中输入的字符给出的解决方案。但它只将字符添加到末尾。

因此,我遵循了在http://www.jsfiddle.net/EXH2k/6/上给出的解决方案,这是 Tim Down 在更改按键时建议的,并且还显示了与 google chrome 中键入的不同的键盘字符。但它对我不起作用(在 Firefox 和 IE 10 中都没有)。

代码:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link type="text/css" rel="stylesheet" href="stylesheet.css" />
    <script type="text/javascript">
        function transformTypedChar(charStr) {
            return charStr == "|" ? "।" : charStr;
        }

        function getInputSelection(el) {
            var start = 0, end = 0, normalizedValue, range,
            textInputRange, len, endRange;

            if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
                start = el.selectionStart;
                end = el.selectionEnd;
            } else {
                range = document.selection.createRange();

                if (range && range.parentElement() == el) {
                    len = el.value.length;
                    normalizedValue = el.value.replace(/\r\n/g, "\n");

                    // Create a working TextRange that lives only in the input
                    textInputRange = el.createTextRange();
                    textInputRange.moveToBookmark(range.getBookmark());

                    // Check if the start and end of the selection are at the very end
                    // of the input, since moveStart/moveEnd doesn't return what we want
                    // in those cases
                    endRange = el.createTextRange();
                    endRange.collapse(false);

                    if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
                        start = end = len;
                    } else {
                        start = -textInputRange.moveStart("character", -len);
                        start += normalizedValue.slice(0, start).split("\n").length - 1;

                        if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
                            end = len;
                        } else {
                            end = -textInputRange.moveEnd("character", -len);
                            end += normalizedValue.slice(0, end).split("\n").length - 1;
                        }
                    }
                }
            }

            return {
                start: start,
                end: end
            };
        }

        function offsetToRangeCharacterMove(el, offset) {
            return offset - (el.value.slice(0, offset).split("\r\n").length - 1);
        }

        function setInputSelection(el, startOffset, endOffset) {
            el.focus();
            if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
                el.selectionStart = startOffset;
                el.selectionEnd = endOffset;
            } else {
                var range = el.createTextRange();
                var startCharMove = offsetToRangeCharacterMove(el, startOffset);
                range.collapse(true);
                if (startOffset == endOffset) {
                    range.move("character", startCharMove);
                } else {
                    range.moveEnd("character", offsetToRangeCharacterMove(el, endOffset));
                    range.moveStart("character", startCharMove);
                }
                range.select();
            }
        }

        $("#inputTextArea").keypress(function (evt) {
            if (evt.which) {
                var charStr = String.fromCharCode(evt.which);
                var transformedChar = transformTypedChar(charStr);
                if (transformedChar != charStr) {
                    var sel = getInputSelection(this), val = this.value;
                    this.value = val.slice(0, sel.start) + transformedChar + val.slice(sel.end);

                    // Move the caret
                    setInputSelection(this, sel.start + 1, sel.start + 1);
                    return false;
                }
            }
        });
    </script>
</head>
<body>
    <textarea name="input" id="inputTextArea" rows="10"></textarea>
</body>
</html>
4

2 回答 2

5

这很容易。用换行符处理等丢弃你的代码,然后这样做:

$(document).ready(function() {
    $('#my-input').on('input', function() {
        var $input = $(this),
            curVal = $input.val();
        var cursorPos = curVal.slice(0, this.selectionStart).length;

        $input.val(curVal.replace(/[|]/g, '।'));
        this.setSelectionRange(cursorPos, cursorPos);
    });
});

工作示例:JSFiddle

于 2013-10-03T08:00:43.393 回答
1

我想在使用 javascript 在 textarea 中输入垂直条 (|) 后立即将其替换为梵文 Danda (।)。

由于您想在键入后立即替换字符,因此这可能是最简单的选项:

$('#inputTextArea').on("keyup", function(e) {
    $(this).val($(this).val().replace(/[|]/g, "।"));
});

我注意到虽然您没有标记 jQuery,但您在代码中使用了 jQuery。因此,基于 jQuery 的解决方案。

一个快速的小提琴:http: //jsfiddle.net/THEre/

于 2013-10-03T08:32:47.563 回答