当前位置: 首页 > 知识库问答 >
问题:

当输入值被JavaScript更改时?

能向晨
2023-03-14

元素的值通过JavaScript代码更改时,会发生什么事件?例如:

$input.value = 12;

input事件在这里没有帮助,因为更改值的不是用户。

在Chrome上测试时,change事件不会被激发。也许是因为元素没有失去焦点(它没有获得焦点,所以不能失去焦点)?

共有2个答案

从渊
2023-03-14

没有内置事件。您至少有四种选择:

  1. 任何时候更改代码中的$input.value时,调用您希望由更改触发的代码
  2. 轮询更改
  3. 为自己提供一个用于更改值的方法,该方法也会进行通知
  4. (3的变体)为自己提供一个属性,用于更改值,这也将执行通知

其中,#1、#3和#4都要求您在代码中执行一些与$input.value=“new value”不同的操作;轮询(选项#2),是唯一可以直接设置value的代码。

详情:

>

  • 最简单的解决方案:当您在代码中更改$input.value时,调用您希望由更改触发的代码:

    $input.value = "new value";
    handleValueChange();
    

    轮询更改:

    var last$inputValue = $input.value;
    setInterval(function() {
        var newValue = $input.value;
        if (last$inputValue != newValue) {
            last$inputValue = newValue;
            handleValueChange();
        }
    }, 50); // 20 times/second
    

    轮询有一个坏名声(有充分的理由),因为它是一个持续的CPU消耗者。当标签页没有焦点时,现代浏览器会降低计时器事件(甚至停止它们),这会稍微减轻一点。20次/秒不是现代系统的问题,即使是手机。

    但是,投票仍然是一个丑陋的最后手段。

    示例

    null

    var $input = document.getElementById("$input");
    var last$inputValue = $input.value;
    setInterval(function() {
        var newValue = $input.value;
        if (last$inputValue != newValue) {
            last$inputValue = newValue;
            handleValueChange();
        }
    }, 50); // 20 times/second
    function handleValueChange() {
        console.log("$input's value changed: " + $input.value);
    }
    // Trigger a change
    setTimeout(function() {
        $input.value = "new value";
    }, 800);
    <input type="text" id="$input">

  • 刘狐若
    2023-03-14

    基于@t-j-crowder和@maciej-swist的答案,让我们添加这个答案,使用“.apply”函数来防止无限循环,而无需重新定义对象。

     function customInputSetter(){
    
      var descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value");
      var originalSet = descriptor.set;
    
      // define our own setter
      descriptor.set = function(val) {
        console.log("Value set", this, val);
        originalSet.apply(this,arguments);
      }
    
      Object.defineProperty(HTMLInputElement.prototype, "value", descriptor);
    }
    
     类似资料:
    • 问题内容: 在laravel中,我们可以通过获得输入值。我尝试通过这样做来更改值。但是然后,我得到了错误消息“” 。 我们是否可以更改输入值,以便在以后调用时获得新的修改后的值? 谢谢。 问题答案: 您可以用来替换单个项目。 或用于替换整个输入数组。 这是文档的链接

    • 问题内容: 我正在尝试在浏览器扩展程序中运行javascript,以自动化在网站上填写表单然后单击按钮的过程- 可以通过在地址栏中键入javascript:code来模拟扩展程序代码。 我遇到问题的网站使用。我有输入字段ID的名称,并且正在使用它们来更改输入字段的值。这些字段已填满,但是当我单击按钮时,它说它们没有填满,没有值,并且都出错了。正在进行一些验证,除非我手动输入值,否则这些验证不会“看

    • 我正在通过一个教程视频制作一个程序,代码是启动、停止或退出汽车。程序的一部分是这样做,如果汽车已经启动或停止,你在程序中告诉他们。我的程序会告诉用户汽车已经启动或停止,但在我告诉它停止两次之后,而不是一次。希望有人能描述一下while循环和if语句中的布尔值之间的关系?

    • 问题内容: 我有一个AngularJS属性指令,并且只要其父输入的值发生更改,我都想采取措施。现在,我正在使用jQuery: 没有jQuery,有没有办法做到这一点?我发现keyPress事件并没有完全实现我想要的功能,虽然我确定自己会提出解决方案,但是当我在Angular项目中使用jQuery时,我会有些紧张。 那么,Angular如何做到这一点呢? 问题答案: AngularJS文档中有一个很

    • 我正在学习反应和反应形式,并试图创建一个动态和可扩展的形式。我已经设置了具有的状态,并基于该类型,显示相应的输入类型(因此它可以是文本、文本区域、单选、选择、日期或复选框)。我试图写一个函数,这样它将动态设置基于的表单输入,但我卡住了试图实现相同的变化。 所以如果,或,等等。 请检查此工作代码沙盒。 看看这个完整的代码片段:- 我仍在努力学习并花时间与ReactJS在一起,因此任何帮助都将不胜感激

    • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript