Javascript 如何在内联选项的输入上使用addEventListener

Javascript 如何在内联选项的输入上使用addEventListener,javascript,firefox-addon,inline,options,Javascript,Firefox Addon,Inline,Options,因此,内联选项有一个名为inputChanged的函数,当您执行某项操作时会触发该函数 例如,与文件选择器内联选项类似:如果单击“浏览”,它将执行以下命令: function showPicker() { var filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); filePicker.init(window, this.getAttribute(

因此,内联选项有一个名为
inputChanged
的函数,当您执行某项操作时会触发该函数

例如,与文件选择器内联选项类似:如果单击“浏览”,它将执行以下命令:

function showPicker() {


          var filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
          filePicker.init(window, this.getAttribute("title"),
                          this.type == "file" ? Ci.nsIFilePicker.modeOpen : Ci.nsIFilePicker.modeGetFolder);
          if (this.value) {
            try {
              let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
              file.initWithPath(this.value);
              filePicker.displayDirectory = this.type == "file" ? file.parent : file;
              if (this.type == "file") {
                filePicker.defaultString = file.leafName;
              }
            } catch (e) {}
          }
          if (filePicker.show() != Ci.nsIFilePicker.returnCancel) {
            this.value = filePicker.file.path;
            this.inputChanged();
          }


}
注意
这个.inputChanged
。 您可以通过获取设置xul属性并警告
inputChanged
来查看此函数是什么

var setting=document.querySelector('setting[pref=“extensions.thropberrestored.customImgIdle”])

现在我们看到inputChanged是:

function inputChanged() {


          if (this.usePref && !this._updatingInput) {
            this.valueToPreference();
            this.fireEvent("oninputchanged");
          }


}
我们看到mxr上的
fireEvent
是:

59
60
61
62
63
78
79
因此,如果我们想触发
oninputchanged
事件,我们必须在设置xul元素上设置
setAttribute
。就像您设置了.setAttribute('oninputchanged','alert(“hi”)”
,在执行文件选择器后,它将显示此
警报。但是我想在
oninputchanged
设置
元素上添加
addEventListener
,这不可能吗

我的次要目标是观察
设置.value
并在它发生变化时做些事情。例如,如果用户执行文件选择器并拾取相同的文件,那么
setting.value
保持不变,实际上更改为相同的内容。这不是我在dom检查器中看到的属性,所以我没有测试变异观察者

但是我想为oninputchanged在这个设置元素上添加EventListener,这不可能吗

如果不修补绑定的
fireEvent
(或者提交一个bug并将其修复),就不能这样做。此方法的名称具有误导性。它实际上并不触发事件,它只是创建一个事件,从
oninputchanged
属性内容创建一个匿名函数并调用该函数。在其中的任何元素上都没有
.dispatchEvent()

编辑当然,您可以从
oninputchanged
代码中自行调度事件

this.dispatchEvent(event);
我的次要目标是观看setting.value

只有当pref值实际更改时,才会触发

元素的
属性上可能会工作

变异观察者不起作用(或者至少不应该起作用),因为变异观察者不应该看到每个设计中匿名节点的变异,并且持有该值的
是匿名的


没有
属性,顺便说一句,只有
(JS)属性。

啊,好的,酷男人,谢谢!我用这个
oninputchanged
东西更新了MDN。这么多东西都没有记录,人们需要分享(我听说
.watch
对性能不好,不是吗?我之所以不敢使用pref-watcher,是因为基于这一更改,我更新了一些xul元素。然后我必须创建另一个观察者,用xul文档通知它。这不是一个坏主意,我只是想利用他们设计的功能:(现在我做了内联废话:哦,我也不确定我是否可以内联
服务。obs.notifyObserver
来自
oninputchanged
。但是更多的想法是它是私有的,所以我确定它们有一些
notifyObserver
功能。这样做的原因是,如果我只是pref-watcher,那么我必须1)测试addont manager tab open(可以打开多个选项卡,windows等)2)是否是我的加载项文档显示该死,我累了…请参见编辑(当然,您可以
notifyObserver
,或者执行其他操作,如直接在相应窗口中调用函数)啊,发送事件!哦,我的天啊,我完全忘记了,谢谢你!你累了,你像我一样打字,“我累了。”哈哈,我不能编辑评论!
this.dispatchEvent(event);