2012-05-02 24 views
14

Tôi đang cố gắng theo dõi các thay đổi đối với hộp chọn (hoặc option yếu tố lồng nhau) với chức năng mới Mutation Observer. Tuy nhiên, chỉ "setAttribute" đang kích hoạt gọi lại của người quan sát đột biến đối với tôi.Webkit Mutation Observer callback không được kích hoạt khi thay đổi thuộc tính hộp chọn

Dưới đây là đoạn code tôi đang sử dụng:

~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); });​ 

Và đây là mã này trong hành động http://jsfiddle.net/gryzzly/wqHn5/

Tôi muốn phản ứng với những thay đổi các thuộc tính (selected trên <option> hoặc value trên <select>), bất cứ đề nghị về lý do tại sao người quan sát không phản ứng lại được chào đón nhiều hơn!

Tôi đang thử nghiệm điều này trong Chrome 18.0.1025.168 trên Mac OS X. Mã sản xuất dĩ nhiên cũng có tiền tố moz cho hàm tạo và phiên bản chưa được sửa cố định, đây là mã thử nghiệm.

UPD.

Kiểm tra mã trong Firefox Hàng đêm và nó hoạt động giống như trong Chrome, cũng như trong Chrome Canary. Tôi đã điền lỗi cho cả hai trình duyệt:

hãy bình luận và bỏ phiếu cho những lỗi nếu bạn cũng thấy vấn đề này gây phiền nhiễu.

+0

Đừng nghĩ rằng tôi muốn dựa vào việc triển khai thử nghiệm một thông số chưa hoàn thành. –

+1

Dường như là một biểu hiện khác của lỗi liên quan đến WebKit được báo cáo chống lại Chromium: http://code.google.com/p/chromium/issues/detail?id=103551 –

+2

@TimDown đã nói tôi đang dựa vào bất cứ điều gì? :-) Tôi đang thử nghiệm bản thân mình! –

Trả lời

4

@gryzzly, tôi đã cập nhật các lỗi Chromium với một phản ứng cụ thể: http://code.google.com/p/chromium/issues/detail?id=128991#c4

Các nhà quan sát Đột biến được giới hạn để quan sát các DOM đăng trạng thái. Nếu bạn muốn biết liệu Trình theo dõi đột biến có thể quan sát điều gì đó, hãy chỉ cần xem xét kết quả đầu ra innerHTML cho phần tử đó. Nếu bạn có thể thấy thay đổi trong trạng thái được phản ánh trong các thay đổi đối với đánh dấu mà tạo ra, thì Nhà quan sát đột biến có thể nghe được khoảng nó.

TL; DR: hoạt động như dự định; để quan sát các thay đổi đối với các thuộc tính IDL như HTMLSelectElement.value, các sự kiện đầu vào như onclick hoặc onchange có lẽ là đặt cược tốt nhất của bạn.

+0

Cảm ơn bạn đã nỗ lực. Tôi đã viết một bình luận: https://code.google.com/p/chromium/issues/detail?id=128991#c5 –

+0

@gryzzly: nhận xét của adamk về lỗi là phát hiện. May mắn thay, đối với các trường hợp mà các thay đổi đối với các thuộc tính như 'giá trị' của các phần tử biểu mẫu không được phản ánh trong thuộc tính DOM, thì có các sự kiện thay thế, chẳng hạn như các sự kiện' thay đổi' và 'đầu vào'. –

+1

@TimDown như tôi đã viết trên trang của các vấn đề, vấn đề là khi JS thay đổi giá trị như thế này 'select.value =" foo ";', cập nhật giao diện người dùng và khi biểu mẫu được gửi giá trị mới, nhưng các sự kiện 'change' và' input' không kích hoạt. –

Các vấn đề liên quan