当前位置: 首页 > 面试题库 >

使用angularjs保留光标位置

赵辉
2023-03-14
问题内容

下面的代码片段实现了我想要的功能input,即,它删除了所有非字母数字字符,转换为大写字母,并保留了光标位置。

element = $(element);

element.keyup(function() {
    var x = element.val();
    var y = x && x.toUpperCase().replace(/[^A-Z\d]/g, '');
    if (x===y) return;
    var start = this.selectionStart;
    var end = this.selectionEnd + y.length - x.length;
    element.val(y);
    this.setSelectionRange(start, end);
});

我将此代码段放置在link指令的中,并且可以正常工作。

问题在于,在应用更改 之前angular模型会看到该值。我尝试向Google查询如何使用或此处的任何内容,但没有任何效果。
__$apply``$digest

(实际上,我以某种方式进行了管理,但是内容重新呈现后我失去了位置。我无法复制它,但是无论如何它还不够好。)


问题答案:

一种这样做的方式

  • 输入仅清洗一次
  • ngChange 然后只触发一次

是使用ngModelController提供的$parsers数组。它被设计为影响模型值(通过其返回值)的地方,但是它也可以用作输入事件的侦听器。

app.directive('cleanInput', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelController) {
      var el = element[0];

      function clean(x) {
        return x && x.toUpperCase().replace(/[^A-Z\d]/g, '');
      }

      ngModelController.$parsers.push(function(val) {
        var cleaned = clean(val);

        // Avoid infinite loop of $setViewValue <-> $parsers
        if (cleaned === val) return val;

        var start = el.selectionStart;
        var end = el.selectionEnd + cleaned.length - val.length;

        // element.val(cleaned) does not behave with
        // repeated invalid elements
        ngModelController.$setViewValue(cleaned);
        ngModelController.$render();

        el.setSelectionRange(start, end);
        return cleaned;
      });
    }
  }
});

但是,我不确定这种用法$parsers是否有点骇人听闻。该指令可以用作:

<input type="text" clean-input ng-model="name">

或者如果您想要一个ngChange功能:

<input type="text" clean-input ng-model="name" ng-change="onChange()">

可以在http://plnkr.co/edit/dAJ46XmmC49wqTgdp2qz?p=preview中查看实际使用情况



 类似资料:
  • 我正在做Liferay 6.2项目。在Liferay中,他们使用了Vaadin。当我点击一个按钮时,它会打开一个不同的iframe。我可以为所有功能编写代码。现在我想使用WebDriver将光标移动到iframe元素。因为当我将鼠标移动到iframe复选框之后,我的自动脚本就可以运行了。我想自动化一个脚本,将鼠标指针移动到元素。 我已经尝试了下面的代码,但它不起作用。 1) 使用动作移动元素: 2

  • 问题内容: 使用呈现对象列表。假设此列表很长,并且用户正在滚动到底部以查看一些对象。 当用户观察对象时,新项目将添加到列表的顶部。这导致被观察对象改变其位置,即,用户在被观察对象的同一位置突然看到其他东西。 添加新项目后,如何将观察到的对象保持在同一位置? 问题答案: 通过使用的属性,它可能非常优雅地解决了。我使用了两个指令- 一个处理包装器元素的滚动位置,另一个处理新元素。如果有什么不清楚的地方

  • 问题内容: 示例应用程序: http //angular.github.com/angular- phonecat/step-11/app/#/phones 如果您选择最后一个手机“ Motorola charm”,它将为您显示手机的详细信息。当您在浏览器上浏览时,它将重新加载数据,并且滚动条位于顶部。 导航返回时,自动滚动到剩余位置的最佳方法是什么?而且,为什么角度重新加载数据? 我的计算机上有

  • 我正在尝试突出显示由鼠标悬停的瓷砖。这是我的代码: 编辑: 光标对象不在鼠标下面,我如何修复和对齐它?

  • 问题内容: 在Google Chrome浏览器中,AJAX在$(function(){....})内调用;似乎可以保持页面加载。 我的网站上有几个带有标签的页面。因为我使用的是廉价的Godaddy托管,所以我希望页面尽快加载。因此,我想在1个标签上加载页面,然后在后台使用AJAX加载其他标签。当我从运行AJAX 光标显示页面已长时间加载(http://jsfiddle.net/mazlix/7fD

  • 问题内容: 我的代码而不是使用代码,因为我之前有过。 所以我的代码: 项目说明包含未呈现的换行符。 假设我已具备上述条件,如何轻松显示换行符? 问题答案: 基于@pilau的答案-但经过改进,即使是公认的答案也没有。 这将使用给定的换行符和空格,但也会在内容边界处中断内容。有关空白属性的更多信息,可以在这里找到: https://developer.mozilla.org/zh-CN/docs/W