我有一个问题,我现在已经苦苦挣扎了几天。
我正在为firefox编写一个userInput记录系统,以便用它来记录基于Web的应用程序的测试。
我正在表单字段上记录onchange事件,并使用带有添加到每个字段的onchange事件的侦听器的contentScript将它们保存在商店中。
field.addEventListener('change', recordFieldChange);
我还使用基于观察者服务的window.confirm方法覆盖来记录用户js确认响应。
var obs = require("observer-service");
obs.add("content-document-global-created", observeWindow);
function observeWindow(subject) {
var window = subject.wrappedJSObject;
var standardConfirm = window.confirm;
window.confirm = function(pMessage) {
response = standardConfirm(pMessage);
recordConfirm(response);
return response;
}
};
我遇到的麻烦是,在字段更改之前记录了由字段更改触发确认的任何确认响应,这是运行测试的错误顺序。
我认为这是因为页面的onchange是在插件内容之前评估的,有没有办法改变这个顺序?
我希望解决方案或解决方法不使用超时或更改基本页面内容。 我还需要能够记录由页面加载等其他事件引起的确认。
答案 0 :(得分:1)
问题是页面和内容脚本在同一个元素上注册事件处理程序 - 并且它们将被调用的顺序是未定义的(但是,我认为Firefox在添加任何侦听器之前始终调用onchange
通过addEventListener
)。您需要在网页执行之前获取change
事件并触发其他操作。解决方案是在顶级capture phase期间捕获事件。在捕获阶段,事件“吸入”到实际元素并在泡沫阶段开始之前触发捕获事件侦听器,并且事件再次上升触发常规事件侦听器。这样的事情应该有效:
window.addEventListener("change", recordFieldChange, true);
function recordFieldChange(event)
{
var field = event.target;
...
}
这不再在单个字段中注册事件侦听器,而是在window
级别注册。请注意,如果网页收听input
或keypress
等其他事件,则无效。