使用javascript更改AngularJS输入文本值 [英] Change AngularJS input text value using javascript

查看:125
本文介绍了使用javascript更改AngularJS输入文本值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我遇到问题的网站使用 angularJS 。我有输入字段ID的名称,并使用它们来更改输入字段值。字段填满但是当我点击按钮时它表示它们没有填充,没有值,它们都是错误的。除非我手动输入值,否则会进行一些不会看到我的更改的验证。



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



以下是代码:

 < input id =shippingAddr-first-nametype =textclass =first-name ng-pristine ng-validmaxlength =16data-ng-model =addressTypes [ addressType] .FirstNamefocus-me =commonAddressTypeProps [addressType] .focusOnFirstNameclient-validation =onExitdata-required-on-exit => 

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

解决方案

触发输入具有ng-model属性的元素的事件,AngularJS可以观察到该事件。事件输入是Angular知道发生了一些变化并且必须运行$ digest循环的方式



一些源代码:

  //如果浏览器支持输入事件,我们没事 - 除了在IE9上没有触发退格时的
//输入事件,删除或削减
if($ sniffer.hasEvent('input')){
element.on('input' ,听众);
} 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修饰符箭头
if(key === 91 ||(15< key&& key< 19)||(37< = key&& key< = 40))return;

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

//如果用户使用IE中的上下文菜单修改输入值,我们需要粘贴和剪切事件来捕获它
if($ sniffer.hasEvent('paste')) {
element.on('paste cut',deferListener);
}
}

一些有效的概念验证:

  angular.module('app',[])。controller('app',function($ scope){$ scope.user = {} $ scope.handleSubmit = function( user){alert('传递名称'+ 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/angula r.min.js>< /脚本>< DIV> < button id =run>在AngularJS< / button>< / div>< div ng-app =app>之外执行`input`事件< div ng-controller =app> < form ng-submit =handleSubmit(user)> < input type =textng-model =user.name/> < input type =submitid =submitvalue =Submit/> < /形式> < / div>< / div>  


I'm trying to run javascript in a browser extension to automate a process of filling in a form on a website and then clicking a button -- the extension code can be simulated by typing javascript:code into the address bar.

The website that I'm having problems with uses angularJS. I have the names of the input field ids and am using those to change the input field values. The fields fill up but when I click the button it says they are not filled, there are no values and they are all in error. Some validation is going on that does not "see" my changes unless I type in the values manually.

Is there a simple way to change the value of the AngularJS input fields that have validation using just the id of the input field.

Here is the code:

<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="">

My attempts using document.getElementById("shippingAddr-first-name").value="Dave"; change the field but do not register correctly during the form submission. It does work however if I type it in manually. I've also tried click(), blur(), and focus(), to simulate some things I might be doing manually but those do not work either.

解决方案

Trigger input event on element with ng-model attribute that is observable by AngularJS. Event input is the way from where Angular knows that some changes occurs and it must run $digest loop

Some source code:

// 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);
    }
  }

Some working proof of concept:

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>

这篇关于使用javascript更改AngularJS输入文本值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆