【问题标题】:Detect if a field is updated with JavaScript or jQuery检测字段是否使用 JavaScript 或 jQuery 更新
【发布时间】:2018-12-12 07:44:33
【问题描述】:

我有一个非常广泛的模板,并且有一个表单用 JavaScript 或 jQuery 更新一个文本字段的值,这个函数一直找不到它,我需要检测这个字段什么时候更新,我已经尝试了所有这些功能,但它没有检测到它何时更新。

从JavaScript更新字段时未检测到,但在字段外写入并单击时更新时检测到的原因是什么?

重要提示:动态添加的值 90,000”,使其成为一个特定的函数,我一直无法找到,并尝试检测该值是否随 JavaScript 发生变化。

$(function(){

// Automatic update, strange function
setTimeout(function(){
  // Value updated automatically
  $('#long').val("90.000");
}, 2000);

/**
 * Detect if that field is updated
 */
$('input#long').on('change', function(){
  alert("Updated");
});

$(':input').on('change', function(){
  alert("Updated");
});

$('input#long').change(function(){
  alert("Updated");
});

$(document).on('change', 'input#long', function(){
  alert("Updated");
});  

$(document).on('change', 'input', function(){
  alert("Updated");
}); 

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="long">

【问题讨论】:

  • $('#long').val('90.000').trigger('change') 应该这样做。如果通过 JS 更改值,则不会触发 DOM 事件。
  • 听起来你想要keyup 事件而不是change
  • 问题是这个值 90,000 是在你点击一个按钮时发出 AJAX 请求后自动添加的,我找不到那个函数或动作来归档那个触发器,这是一个非常广泛而复杂的Wordpress模板,如果这个值发生变化,我更容易尝试通过Javascript检测。
  • @Learningandsharing 您是否尝试过.trigger('change') 方法?让我将其发布为答案。

标签: javascript jquery


【解决方案1】:

因此,根据您对其他答案的编辑/cmets,您无法手动触发change

MutationObserver 将是解决此问题的好方法,除非他们无法观察输入值的变化,as explained here

据我所知,您唯一的出路是每隔几毫秒使用setInterval 将当前值与旧值进行比较。有点丑陋,根本不是最佳的,但可以完成工作。这是一个示例:

$(function() {
  setTimeout(function() {
    $('#long').val('90.000');
  }, 1000);
  
  $('#long').on('change', function() {
    alert('changed');
  });
  
  // Store the current value
  $('#long').data('oldVal', $('#long').val());
  
  // Every 100ms, trigger `change` event whenever new value != old
  setInterval(function() {
    if ($('#long').val() !== $('#long').data('oldVal')) {
      $('#long').trigger('change');
      $('#long').data('oldVal', $('#long').val());
    }
  }, 100);    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="long">

【讨论】:

  • 非常感谢,这将是解决它的最接近的解决方案,因为显然,如果字段已更新并且我们无权访问,则无法通过 Javascript 或 Jquery 检测动态更新该字段的函数,这样做是有意义的,并创建一个间隔,每隔一定时间检查该值。
【解决方案2】:

您可以使用 jquery 中的change 方法来订阅事件。

html

<input class="target" type="text" value="Field 1">

和脚本

$(".target").change(function() {
  alert( "Handler for .change() called." );
});

See this codepen
See the jquery docs

【讨论】:

    【解决方案3】:

    DOM 事件不会被 JS/jQuery 调用触发。您可以轻松地手动触发change 事件,如下所示:

    $('#long').val('90.000').trigger('change')

    示例

    $(function(){
    
    // Automatic update, strange function
    setTimeout(function(){
      // Value updated automatically
      $('#long').val("90.000").trigger('change');
    }, 2000);
    
    /**
     * Detect if that field is updated
     */
    $('input#long').on('change', function(){
      alert("Updated");
    });
    
    $(':input').on('change', function(){
      alert("Updated");
    });
    
    $('input#long').change(function(){
      alert("Updated");
    });
    
    $(document).on('change', 'input#long', function(){
      alert("Updated");
    });  
    
    $(document).on('change', 'input', function(){
      alert("Updated");
    }); 
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" id="long">

    【讨论】:

    • 添加这个值的函数 $('#long').val("90.000").trigger('change');我没有它,发现它要花很多时间,所以我必须选择检测字段是否从 Javascript 更新的选项,通过 Jquery 检测它并修改自动添加的值。
    【解决方案4】:

    您是否尝试过按键释放时直接触发的按键触发?

    $(function(){
    
    // Automatic update, strange function
    setTimeout(function(){
      // Value updated automatically
      $('#long').val("90.000");
    }, 2000);
    
    /**
     * Detect if that field is updated
     */
    
    $( "#long" ).keyup(function() {
      alert( "Handler for .keyup() called." );
    });
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" id="long">

    【讨论】:

    • 是这个值是动态的,我没有添加这个值的函数,我需要找到一种快速的方法来检测值是否从 Javascript 而不是用户操作发生变化。
    • 所以输入是通过 Ajax 调用更新的,但是您无权访问此函数,对吗?因为如果你可以访问 Ajax 请求,你可以使用回调来实现你所需要的
    • 如果它是从 Ajax 调用中更新的,并且发出该 Ajax 请求的函数我无法找到它,如果我有权访问该函数,则该主题可能会得到解决,但很多恩,因为他们给了我很好的贡献,虽然我还在继续寻找解决它的方法
    【解决方案5】:

    使用keyuppaste 代替change。见keyup()

    $(function(){
    
    // Automatic update, strange function
    setTimeout(function(){
      // Value updated automatically
      $('#long').val("90.000");
    }, 2000);
    
    /**
     * Detect if that field is updated by key press or pasting text
     */
    $(document).on('keyup paste', 'input', function(){
      alert("Updated text field");
    }); 
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" id="long">

    change()

    change 事件会在元素值更改时发送到元素。这个 事件仅限于 input 元素、textarea 框和 select 元素。对于选择框、复选框单选按钮,当用户使用鼠标进行选择时,会立即触发事件, 但对于其他元素类型,事件被推迟到 元素失去焦点。

    【讨论】:

    • 感谢@smart-googler,是否有替代或更快的方法来检测字段是否从 Javascript 更新,并从 Jquery 中检测?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2011-02-02
    相关资源
    最近更新 更多