【问题标题】:Change AngularJS input text value using javascript使用 javascript 更改 AngularJS 输入文本值
【发布时间】:2015-07-19 06:35:52
【问题描述】:

我正在尝试在浏览器扩展程序中运行 javascript,以自动完成在网站上填写表单然后单击按钮的过程——可以通过在地址栏中键入 javascript:code 来模拟扩展程序代码。

我遇到问题的网站使用angularJS。我有输入字段 ID 的名称,并且正在使用这些名称来更改输入字段值。字段已填满,但是当我单击按钮时,它说它们未填写,没有值,而且它们都出错了。一些验证正在进行,除非我手动输入值,否则不会“看到”我的更改。

是否有一种简单的方法来更改仅使用输入字段的 id 进行验证的 AngularJS 输入字段的值。

代码如下:

<input id="shippingAddr-first-name" type="text" class="first-name ng-pristine ng-valid" maxlength="16" data-ng-model="addressTypes[addressType].FirstName" focus-me="commonAddressTypeProps[addressType].focusOnFirstName" client-validation="onExit" data-required-on-exit="">

我尝试使用 document.getElementById("shippingAddr-first-name").value="Dave";在提交表单时更改字段但未正确注册。但是,如果我手动输入它,它确实有效。我还尝试过click()blur()focus(),以模拟我可能手动执行的一些操作,但这些操作也不起作用。

【问题讨论】:

  • 你在使用 jQuery 吗?我认为如果你使用 jQuery 会容易得多。
  • 我没有使用 jquery。

标签: javascript angularjs input


【解决方案1】:

在具有 AngularJS 可观察到的 ng-model 属性的元素上触发 input 事件。事件 input 是 Angular 知道发生某些更改并且必须运行 $digest 循环的方式

一些源代码:

// if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
  // input event on backspace, delete or cut
  if ($sniffer.hasEvent('input')) {
    element.on('input', listener);
  } else {
    var timeout;

    var deferListener = function(ev, input, origValue) {
      if (!timeout) {
        timeout = $browser.defer(function() {
          timeout = null;
          if (!input || input.value !== origValue) {
            listener(ev);
          }
        });
      }
    };

    element.on('keydown', function(event) {
      var key = event.keyCode;

      // ignore
      //    command            modifiers                   arrows
      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;

      deferListener(event, this, this.value);
    });

    // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
    if ($sniffer.hasEvent('paste')) {
      element.on('paste cut', deferListener);
    }
  }

一些工作的概念证明:

angular.module('app', []).controller('app', function($scope) {
  $scope.user = {}
  $scope.handleSubmit = function(user) {
    alert('passed name ' + JSON.stringify(user))
  }
})

$(function() {
  $('#run').click(function() {
    fillElement($('[ng-model="user.name"]'), 'some user name')
    sendForm($('[ng-submit="handleSubmit(user)"]'));
  })

  function fillElement($el, text) {
    $el.val(text).trigger('input')
  }

  function sendForm($form) {
    $form.submit()
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div>
  <button id="run">Execute `input` event outside AngularJS</button>
</div>
<div ng-app="app">
  <div ng-controller="app">
    <form ng-submit="handleSubmit(user)">
      <input type="text" ng-model="user.name" />
      <input type="submit" id="submit" value="Submit" />
    </form>
  </div>
</div>

【讨论】:

  • 谢谢。虽然我不太了解 jquery,或者 angularjs 这一切都给了我足够的代码来解决它。只要我能得到角度元素,然后使用 trigger("input") 似乎就可以解决问题。
【解决方案2】:

您应该使用 AngularJS 的数据绑定,在输入上放置一个 ng-model,因此您需要更改该值以获取/设置输入值,在您的控制器中您可以这样做:

JSFiddle

.controller('myCtrl', function ($scope) {
    $scope.addressTypes = [];
    $scope.addressTypes['onetype'] = { FirstName: 'Dave'};
});

【讨论】:

  • 感谢您的回答和创建示例。我更改了描述以更清楚地了解我正在尝试的内容。我需要处理的只是输入字段的 id 以及我可以使用 javascript 和 id 读取的任何参数。
【解决方案3】:

使用angular.element

angular.element(document.querySelector("#shippingAddr-first-name")).val("Dave");

【讨论】:

  • 我在地址栏中使用 javascript:thecode 进行了尝试,但是当我单击按钮时,angularjs 似乎没有注册更改。
  • 您应该应用更改。你应该检查一下。 stackoverflow.com/questions/31301475/…
  • 我通过这个答案与 Krzysztof 的回答一起取得了成功:angular.element(document.querySelector("#shippingAddr-first-name")).val("Dave").trigger ("输入");
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多