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