编程语言
首页 > 编程语言> > javascript-如何在内联选项的inputChanged上使用addEventListener

javascript-如何在内联选项的inputChanged上使用addEventListener

作者:互联网

因此,内联选项具有称为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();
          }


}

注意this.inputChanged.
您可以通过获取设置xul属性并提醒inputChanged来了解此功能.

var setting = document.querySelector(‘setting [pref =“ extensions.ThrobberRestored.customImgIdle”]’);

现在我们看到inputChanged为:

function inputChanged() {


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


}

我们看到mxr上的fireEvent为:http://mxr.mozilla.org/mozilla-release/source/toolkit/mozapps/extensions/content/setting.xml#106

59       <method name="fireEvent">
60         <parameter name="eventName"/>
61         <parameter name="funcStr"/>
62         <body>
63           <![CDATA[
64             let body = funcStr || this.getAttribute(eventName);
65             if (!body)
66               return;
67 
68             try {
69               let event = document.createEvent("Events");
70               event.initEvent(eventName, true, true);
71               let f = new Function("event", body);
72               f.call(this, event);
73             }
74             catch (e) {
75               Cu.reportError(e);
76             }
77           ]]>
78         </body>
79       </method>

因此,我们看看是否要触发oninputchanged事件,我们必须在设置xul元素上设置setAttribute.因此,就像您执行了setting.setAttribute(‘oninputchanged’,’alert(“ hi”))’一样,在执行文件选择器之后,它将显示此警报.但是我想在oninputchanged的此设置元素上添加eventListener,这是不可能的吗?

我的目标目标是观察setting.value并在其更改时执行一些操作.就像如果用户执行文件选择器并选择相同的文件一样,则setting.value保持不变,实际上更改为同一件事.这不是我在dom inspector中看到的属性,因此我没有测试突变观察者.

解决方法:

But I want to addEventListener on this setting element for oninputchanged, is this not possible?

并非没有对绑定的fireEvent进行修补(或提交错误并修复它).此方法的名称具有误导性.它实际上并不触发事件,它只是创建一个事件,从oninputchanged属性内容创建一个匿名函数并调用该函数.那里的任何元素上都没有.dispatchEvent().

编辑当然,您可以自己在oninputchanged代码中调度事件.

this.dispatchEvent(event);

My side goal goal is to watch setting.value

仅当pref值实际更改时,才会触发pref observer.

< setting>的值属性为.watch.元素可能起作用…

突变观察者将无法工作(或至少不应如此),因为突变观察者不应在每个设计中看到匿名节点的突变,并且< label>保持该值是匿名的.

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

标签:inline,firefox-addon,options,javascript
来源: https://codeday.me/bug/20191121/2052744.html