我正在尝试使用新的Mutation Observer功能监视对选择框(或嵌套option
元素)的更改。但是,只有“setAttribute”会为我触发突变观察者的回调。
这是我正在使用的代码:
~function(doc, $) {
var select = $('select');
// http://www.w3.org/TR/dom/#mutation-observers
var observer = new WebKitMutationObserver(function(mutations) {
alert(mutations.length + " mutations happened");
});
observer.observe(select, {
// monitor descendant elements – changing `selected` attr on options
subtree: true,
attributes: true
});
// this triggers Observer's reaction, but doesn't update select box UI
select.setAttribute('value', 'whee');
// this updates select box UI, but doesn't trigger mutation observer's callback
select.value = "whee";
// this also updates the UI, but doesn't trigger mutation observer's callback
select.getElementsByTagName('option')[0].selected = true;
//
// neither does manual selecting of options trigger mutation observer unfortunately :(
button.addEventListener('click', function(e) {
e.preventDefault();
// my goal is to react to this change here
select.value = Math.random() > .5 ? "whee" : "whoa";
}, false);
}(document, function(selector) { return document.querySelector(selector); });
这是这段代码在运行 http://jsfiddle.net/gryzzly/wqHn5/
我想对属性的更改(selected
on<option>
或value
on <select>
)做出反应,任何关于为什么观察者不做出反应的建议都非常受欢迎!
我正在 Mac OS X 上的 Chrome 18.0.1025.168 中对此进行测试。生产代码当然也有moz
构造函数的前缀和无前缀版本,这是测试代码。
UPD。
也在 Firefox Nightly 中测试了代码,它的行为方式与 Chrome 以及 Chrome Canary 中的行为相同。我已经为两种浏览器填充了错误:
- https://bugzilla.mozilla.org/show_bug.cgi?id=757077
- https://code.google.com/p/chromium/issues/detail?id=128991
如果您也觉得这个问题很烦人,请对这些错误发表评论并投票。