2010-01-15 39 views
5

Tôi có thư viện JavaScript cập nhật ẩn<textarea> phần tử HTML với một số dữ liệu dựa trên một số thứ.Sự kiện cho thay đổi văn bản

Trong ứng dụng (JavaScript) của tôi, tôi muốn biết khi nào các cập nhật này xảy ra mà không phải đi qua mã thư viện hiện có.

Tôi đã hy vọng có một sự kiện cho điều này, nhưng rõ ràng là không.

Tôi sẽ nghe những thay đổi của vùng văn bản như thế nào?

Thay đổi có thể đơn giản như document.getElementById("myTextarea").value = "hello";

EDIT tôi sẽ sử dụng FireFox chỉ, vì mã này sẽ chỉ là một phần của một bộ kiểm tra Tôi đang xây dựng.

+0

I don' Tôi hiểu, bạn đang nói về loại sự kiện nào? - Sau khi đọc thêm ba lần nữa, tôi hiểu rồi. Bạn muốn có một sự kiện cho bất kỳ cập nhật nào trên vùng văn bản ẩn đó. – Harmen

+0

sự kiện sẽ kích hoạt khi nội dung của văn bản khác với nội dung trước đó. Tôi nghĩ rằng 'onchange' sẽ làm điều này, nhưng nó không nếu bạn không tương tác với bản thân văn bản. –

+0

'onchange' thực sự dường như không cắt nó, đã xóa câu trả lời của tôi. Điều đó thật tệ - nếu onchange không làm điều đó, tôi không thể nghĩ ra bất kỳ sự kiện nào khác có thể bắt được điều này, ngoại trừ việc thường xuyên bỏ phiếu cho giá trị của trường mà tất nhiên là khủng khiếp. –

Trả lời

3

Nếu bạn kiểm soát thư viện Javascript mà bạn đề cập, tôi sẽ nói cách dễ nhất là kích hoạt thủ công sự kiện change mỗi khi bạn thay đổi giá trị của trường.

Tôi nghĩ rằng đây là cách nó được thực hiện trong JQuery: Events/change Nếu không, một đơn giản document.getElementById('myTextarea').onchange() cũng có thể hoạt động.

Nếu bạn có nhiều cuộc gọi, bạn có thể bọc thay đổi giá trị và kích hoạt sự kiện thành chức năng changeFormElement(id, value).

Điều này đòi hỏi, tất nhiên, bạn có thể sửa đổi mọi trường hợp khi văn bản thay đổi. Nếu điều đó được đưa ra, đây có lẽ là cách thanh lịch nhất.

+1

'thay đổi' trong jQuery chỉ được kích hoạt khi ai đó mất tập trung vào trường nhập – Harmen

+0

+1 Pekka. Tôi đồng ý rằng chỉnh sửa thư viện sẽ là hành động tốt nhất nếu có thể. * @ Harmen: * Anh ấy đang nói về việc chỉnh sửa thư viện mà người hỏi đang sử dụng để biến nó thành sự kiện 'thay đổi'. –

1

Sự kiện DOM không xảy ra khi giá trị cho nút được đặt lập trình thông qua node.value; Tìm kiếm tài liệu API của thư viện JavaScript của bạn và xem liệu chúng có cơ chế thông báo nào không.

CHỈNH SỬA: Firefox? Oh tuyệt vời, sau đó có chức năng thú vị như xem. Nó theo dõi những thay đổi về tài sản. Đối với bạn, điều này có nghĩa là khi thư viện thay đổi thuộc tính 'value' của vùng văn bản bạn nhận được thông báo. Điều gì tốt đẹp hơn, là bạn thậm chí có thể kiểm soát giá trị được giải quyết cho tài sản. Xem trong hành động.

var textnode = document.createElement('textarea'); 
textnode.watch('value', function(attr, oldv, newv){ 
    alert(newv); 
    return newv; // you have to return correct value back. 
}); 

//and now trigger the change to see that this works. 
textnode.value = 'Bla'; 

Có thể điều này sẽ giúp ích? :)

+0

Vâng tôi biết, nhưng tôi nghĩ ít nhất textarea sẽ có chức năng như vậy vì nó nhiều hơn 'vùng chứa dữ liệu' thay vì chỉ là phần tử văn bản. –

2

Tôi biết nó có thể không phải là những gì bạn muốn nghe nhưng chỉ có vẻ như IE có một sự kiện có thể xử lý việc này. Đó là sự kiện onpropertychange.

textArea.onpropertychange = function() 
{ 
    if (event.propertyName == "innerText") 
     alert('innerText has changed.'); 
} 

Nếu bạn được phép sửa đổi mã của thư viện, tôi sẽ làm như Pekka đã đề cập và điều chỉnh mã để kích hoạt sự kiện thay đổi. Điều duy nhất thực sự của trình duyệt chéo mà bạn có thể làm là sử dụng bộ hẹn giờ. Nếu bạn sử dụng bộ hẹn giờ tần số đủ thấp, có thể thậm chí không đáng chú ý với người dùng cuối mà bạn không sử dụng sự kiện.

+0

+1 Điều này rất hữu ích. –

+1

Tôi luôn mơ hồ về việc đề cập đến các giải pháp chỉ dành cho IE. Cho dù bạn có thể đăng tải nó như thế nào vì lợi ích của người hỏi, và nó có thể đúng như thế nào, một số người ghét IE sẽ ghét bạn mà không nhắc đến tại sao. –

1

Có tất nhiên một cách unelegant và dishonorificabilitudinitatible để đạt được điều này, bằng cách thiết lập một bộ đếm thời gian:

var oldVal, el; 
function setTimer(){ 
    setTimeout(function(){ 
     if(el.value != oldVal){ 
      console.log('something happened'); 
      oldVal = el.value; 
     } 
     setTimer(); 
    }, 5000); 
}; 

này sẽ so sánh giá trị mỗi năm giây với giá trị trong năm giây.

2

Trong FireFox, bạn có thể kéo dài tuổi value setter:

HTMLTextAreaElement.prototype.__defineSetter__("value", function(t) { 
    alert('someone is setting the value of a textarea'); 
    return this.textContent = t; 
}); 
+0

Điều này thật tuyệt vì tôi sẽ chỉ sử dụng Firefox! Tôi nên đã xác định rằng nó sẽ không phải là một ứng dụng được gửi tới người dùng, nhưng chỉ là một phần của bộ thử nghiệm mà tôi đang xây dựng. Cảm ơn! –

+0

Tôi có thể kích hoạt tính năng này cho một yếu tố cụ thể không? –

+0

Không, nhưng bạn có thể kiểm tra 'this.id' bên trong. –

-3

Xin lưu ý, về giá trị textarea không hoạt động, nó hoạt động như "innerHTML", do đó sử dụng như

document.getElementById("myTextarea").innerHTML = "hello"; 
+0

Không hoàn toàn đúng. Nếu bạn muốn kiểm tra nội dung vừa viết bên trong một textarea, bạn phải sử dụng 'value'. Ví dụ:

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