【问题标题】:Restrict user to enter/delete any alphabets限制用户输入/删除任何字母
【发布时间】:2014-04-29 07:49:41
【问题描述】:

我正在尝试使用 AngularJS 的 ACE 编辑器(使用 UI-Ace)。我有一个查询。 我可以限制用户吗

  1. 除了预定义的字符(比如;)之外,不要输入任何字符
  2. 不删除除预定义字符或空格以外的任何字符

UI-Ace on angular暴露ACE编辑器的onChange事件如下:

$scope.aceChanged = function(e) {
//
};

在 php 中我们只是检查了输入的字符与指定的字符列表/数组/表达式/ascii 不匹配,但是我如何才能在其中获取正在更改/输入/删除的字符。

请指导。

编辑: 我正在按照用户的回答进行尝试:但我收到错误,例如编辑器变量未定义或行未定义

$scope.aceLoaded = function(_editor) {
    // Options
    //_editor.setReadOnly(true);
    //editor.setOption("showPrintMargin", false)        
    _editor.setOption("showPrintMargin", false);
    //_editor.setShowInvisibles(true);
    var _session = _editor.getSession();

    //_session.setUseSoftTabs(false);

    //editor.on("change", onchange)
    _editor.commands.on("afterExec", afterExec);

  };

  var revertScheduled = false;

  $scope.aceChanged = function(e) {
    if($scope.startt ==0){ $scope.startt = new Date().getTime()};
    if (!revertScheduled && _editor.curOp) {
        var text = e.data.lines
            ? e.data.lines.join("\n")
            : e.data.text;

        var shouldRevert = false;
        var isInsertion = e.data.action[0] == "i";
        if (isInsertion && !/^[;]+$/.test(text)) {
            shouldRevert = true;
        } else if (!isInsertion && !/^[; ]+$/.test(text)) {
            shouldRevert = true;
        }

        if (shouldRevert) {
            editor.session.mergeUndoDeltas = false
            editor.session.markUndoGroup()
            revertScheduled = true
            console.log(e.data.text, editor.curOp)
        }
    }
      //
    $http({
        url: global.apiurl+"splitrec",//"http://medline.dev/api/splitrec",
        method: "POST",
        data: {'record': $scope.record.name}
    }).success(function (data, status, headers, config) {
             // assign  $scope.persons here as promise is resolved here
            //$log.log(data);
        $scope.res = data;
        $scope.prova();

        }).error(function (data, status, headers, config) {
            $scope.status = status;
            $log.log(status);
        });
  };


var onchange = function(e) {

}

var afterExec = function() {
    if (revertScheduled) {
        editor.undo();
        revertScheduled = false
    }
}

我的 e 的日志输出:(curOP 为空)

[Object, y]
 0: Object
    data: Object
    action: "insertText"
    range: i
    text: "r"
    __proto__: Object
    __proto__: Object
 1: y
    $blockScrolling: 0
    $enableMultiselect: true
    $highlightPending: false
    $historyTracker: function () { [native code] }
    $isFocused: false
    $mouseHandler: l
    $multiselectOnSessionChange: function () { [native code] }
    $onAddRange: function () { [native code] }
    $onChangeAnnotation: function () { [native code] }
    $onChangeBackMarker: function () { [native code] }
    $onChangeBreakpoint: function () { [native code] }
    $onChangeFold: function () { [native code] }
    $onChangeFrontMarker: function () { [native code] }
    $onChangeMode: function () { [native code] }
    $onChangeTabSize: function () { [native code] }
    $onChangeWrapLimit: function () { [native code] }
    $onChangeWrapMode: function () { [native code] }
    $onCursorChange: function () { [native code] }
    $onDocumentChange: function () { [native code] }
    $onMultiSelect: function () { [native code] }
    $onRemoveRange: function () { [native code] }
    $onScrollLeftChange: function () { [native code] }
    $onScrollTopChange: function () { [native code] }
    $onSelectionChange: function () { [native code] }
    $onSingleSelect: function () { [native code] }
    $onTokenizerUpdate: function () { [native code] }
    $opResetTimer: function (e){n==null&&(n=setTimeout(r,e||t))}
    $search: o
    _$emitInputEvent: function (e){n==null&&(n=setTimeout(r,e||t))}
    _defaultHandlers: Object
    _eventRegistry: Object
    commands: o
    container: div.ng-valid.ace_editor.ace-chrome.ng-dirty
    curOp: null
    env: Object
    keyBinding: s
   lastFileJumpPos: null
   mergeNextCommand: true
   multiSelect: u
   prevOp: Object
   previousCommand: null
   renderer: g
   selection: u
   selections: Array[5]
   sequenceStartTime: 1399493671829
   session: p
   textInput: f

请指导

【问题讨论】:

    标签: javascript angularjs angular-ui ace-editor


    【解决方案1】:

    如果你可以访问真正的ace实例,你可以使用以下方法

    var revertScheduled = false
    var onchange = function(e) {
        if (!revertScheduled && editor.curOp) {
            var text = e.data.lines
                ? e.data.lines.join("\n")
                : e.data.text;
    
            var shouldRevert = false;
            var isInsertion = e.data.action[0] == "i";
            if (isInsertion && !/^[;]+$/.test(text)) {
                shouldRevert = true;
            } else if (!isInsertion && !/^[; ]+$/.test(text)) {
                shouldRevert = true;
            }
    
            if (shouldRevert) {
                editor.session.mergeUndoDeltas = false
                editor.session.markUndoGroup()
                revertScheduled = true
                console.log(e.data.text, editor.curOp)
            }
        }
    }
    
    var afterExec = function() {
        if (revertScheduled) {
            editor.undo();
            revertScheduled = false
        }
    }
    editor.on("change", onchange)
    editor.commands.on("afterExec", afterExec)
    

    测试更改是否是不允许的,然后将其还原。

    【讨论】:

    • 您能解释一下我们如何不输入任何字符,除了预定义的字符(比如;),请解释一下 var shouldRevert = e.data.lines 吗? e.data.lines.length > 3 : /([dr])/.test(e.data.text)
    • 对不起,我假设你只是不熟悉 ace api 并且可以自己处理正则表达式。我已经更新了示例以完全按照您在问题中描述的内容:测试插入/删除的文本是否与允许的字符列表匹配,如果不匹配则恢复更改。
    • 请查看我的代码,我已将其添加到我的问题中。好像有问题。无法获取 editor.CurOp
    • 能不能做在线demo,比如jsbin?我认为您使用的是旧版本的 ace,或者您的编辑器变量不是 ace 的实例,而是 UI-Ace 的包装器对象。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2020-12-30
    • 2019-12-31
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多