Javascript 程序注入上的更改和输入事件

Javascript 程序注入上的更改和输入事件,javascript,events,google-chrome-extension,Javascript,Events,Google Chrome Extension,我正在重新制定我的问题,因为它第一次不清楚,我已经编辑了我的其他问题太多次。我认为这是完全不同的,因为浏览器扩展的澄清,它不应该被认为是一个重复的问题 此事件侦听器用于与个人网页交互的浏览器扩展,该网页在加载页面后通过服务器更新了元素(我只是在这里使用提示来模拟延迟的元素更新)。这是一个调试脚本,用于为元素添加输入事件侦听器,以便在以编程方式向元素提供输入后调用另一个函数。目前,事件侦听器仅在手动获取其输入时运行。如果在一个脚本中调用所有内容,我可以跳过额外的事件侦听器,在更新元素后只调用函数,

我正在重新制定我的问题,因为它第一次不清楚,我已经编辑了我的其他问题太多次。我认为这是完全不同的,因为浏览器扩展的澄清,它不应该被认为是一个重复的问题

此事件侦听器用于与个人网页交互的浏览器扩展,该网页在加载页面后通过服务器更新了元素(我只是在这里使用提示来模拟延迟的元素更新)。这是一个调试脚本,用于为元素添加输入事件侦听器,以便在以编程方式向元素提供输入后调用另一个函数。目前,事件侦听器仅在手动获取其输入时运行。如果在一个脚本中调用所有内容,我可以跳过额外的事件侦听器,在更新元素后只调用函数,但是扩展执行流是独立的,因此事件侦听器需要独立

HTML网页

<textarea id="fI"></textarea>
<button type="button" id='pressMe'>Press Me</button>
<textarea id="example2"></textarea>
浏览器扩展内容脚本

document.getElementById("fI").addEventListener("input", blabla);
function blabla() {
  var something = document.getElementById("fI").innerHTML;
  document.getElementById("example2").innerHTML = something+" continue the rest of the script here";
}

很抱歉,我不确定您是否控制了值的更改而没有获取事件,或者其他脚本是否控制了值的更改而没有获取事件

如果正在执行分配,并且希望传播事件,则可以执行以下操作:

element.value = "a change that I want to fire an event.";
element.dispatchEvent(new Event('input'));
如果您希望在其他程序更改值时获取事件,那么您可能无法捕获事件。在这种情况下,您可以使用setInterval对该值进行轮询,尽管这非常糟糕

function callOnValueChange(element, callback, once) {
     var initialValue = element.value,
         check;
     check = setInterval(function() {
         if (element.value !== initialValue) {
             callback.call(element);
             initialValue = element.value;
             if (once) clearInterval(check);     
         }
     }, 500);
}

可以使用变异观察者以基于事件的方式实现第二部分。有趣的是,我从未使用过变异观察者。但是在玩了一点之后,似乎只有在使用文本节点而不是value属性指定文本区域的值时,这才有效。上面的fiddle对MutationObserverInit对象有一个拼写错误,我在其中使用了“attribute”而不是“attributes”。更新的fiddle显示了相同的行为和正确的拼写。我的错。我真的认为dispatchEvent会起作用,但它没有。。。是的,在这个场景中,我控制着所有的脚本,只是我必须让扩展脚本响应通过服务器脚本更新的HTML元素,这也是我的脚本。。。这就是我的代码的基本设置方式,只是事件侦听器不在同一个文件中。。。也许扩展还需要另一个步骤来识别自定义事件?它可能与何时注入扩展的脚本有关。尽管Chrome的默认设置似乎是在文档准备就绪之后和窗口加载之前/之后。关键字可以帮助您跟踪/了解在发送事件后发生的情况。当所有其他方法都失败时,在任何地方插入控制台日志以查看什么是/不是被激发可以有所帮助。
function callOnValueChange(element, callback, once) {
     var initialValue = element.value,
         check;
     check = setInterval(function() {
         if (element.value !== initialValue) {
             callback.call(element);
             initialValue = element.value;
             if (once) clearInterval(check);     
         }
     }, 500);
}