2008-11-12 19 views

Trả lời

46

textInput chỉ được gửi khi người dùng có văn bản nhập vào điều khiển. change, mặt khác, được gửi đi theo mọi thay đổi do người dùng cam kết. Vì vậy, ví dụ, nếu người dùng xóa một phần của văn bản, chỉ có sự kiện change được gửi đi.

Không những là phái khi văn bản được sửa đổi thông qua mã:

flash.events.TextEvent.TEXT_INPUT:

"cử đến khi người dùng loại, xóa, hoặc bột nhão văn bản vào kiểm soát."

(bỏ qua từ "xóa" đó - Tôi chỉ cố gắng nó và sự kiện này là không cử khi văn bản bị xóa bởi người sử dụng)

flash.events.Event.CHANGE:

"Được gửi đi khi văn bản trong điều khiển TextInput thay đổi thông qua đầu vào của người dùng . Sự kiện này không xảy ra nếu bạn sử dụng liên kết dữ liệu hoặc ActionScript mã để thay đổi văn bản. "

Bạn cũng có thể sử dụng các sự kiện valueCommit, được cử khi người dùng "cam kết" những thay đổi (thường là bằng cách di chuyển trọng tâm ra khỏi lĩnh vực văn bản), nhưng hãy nhớ rằng sự kiện này cũng được gửi đi khi lĩnh vực này giá trị được thay đổi theo chương trình.

+2

Cảm ơn rất nhiều vì câu trả lời rõ ràng. Lưu ý: Tôi đã thực hiện một số kiểm tra và thấy rằng khi truy cập thuộc tính 'text' trong trình xử lý sự kiện cho sự kiện' textInput' (sử dụng 'event.currentTarget.text'), giá trị tôi nhận được phản ánh giá trị' text' _before_ nhấn phím đã kích hoạt sự kiện. –

+0

Điều đó không đúng đối với tôi, ít nhất là không phải trong Flex 4.5 (tôi đoán Flex 4 quá) bằng cách sử dụng Spark TextInput. Tôi nhận được giá trị văn bản cuối cùng trong sự kiện thay đổi, cũng có một sự kiện thay đổi được gửi đi trước đó. – Enrique

3

Đó là câu trả lời tuyệt vời, hasseg. Nếu tôi có đủ đại diện, tôi sẽ bỏ phiếu.

Tùy thuộc vào nội dung bạn đang nhập vào của người dùng, bạn có thể phân lớp thành phần TextInput và ghi đè trình lắng nghe nội bộ cho sự kiện thay đổi và textInput.

Tôi không biết nếu có nhiều lý do bạn muốn làm điều này, nhưng tôi đã làm nó gần đây để đối phó với một lỗi trong OS X gây ra dấu ngắt dòng được đại diện là '\ r', thay vì '\ n'.

Tất cả bạn cần làm là thêm sau siêu của bạn() gọi sau trong constructor của đối tượng subclassed của bạn:

this.addEventListener(Event.CHANGE, textFieldChangeListener); 
this.addEventListener(TextEvent.TEXT_INPUT,textFieldInputListener); 

Và sau đó thêm các phương pháp nghe và mã bạn muốn thực hiện.

0

Cả sự kiện Event.CHANGE và TextEvent.TEXT_INPUT đều kích hoạt trên mỗi ký tự được nhập. Nếu bạn muốn một sự kiện sẽ chỉ kích hoạt một lần duy nhất cho một trường TextInput đã cho, hãy sử dụng FocusEvent.FOCUS_OUT.

Giống như Event.CHANGE và TextEvent.TEXT_INPUT, sự kiện này sẽ chỉ kích hoạt cho đầu vào của người dùng, không phải cho các thay đổi có lập trình cho giá trị.

+1

Tôi nhận ra rằng sau khi đệ trình điều này, việc sử dụng FOCUS_OUT không phải là một cách tiếp cận tuyệt vời bởi vì, trong khi đúng là nó chỉ được kích hoạt một lần cho mỗi trường, nó sẽ cho bạn biết liệu người dùng có thay đổi giá trị hay không. – hrabinowitz

+0

Vì vậy, có vẻ như, như hasseg đã lưu ý ở trên, CHANGE là lựa chọn tổng thể tốt nhất để lắng nghe những thay đổi của người dùng đối với một trường TextInput. Tuy nhiên, nếu người dùng gõ control-C để sao chép giá trị trường, điều này cũng sẽ kích hoạt sự kiện CHANGE. – hrabinowitz

0

CHANGE không cho bạn biết những gì đã thay đổi mặc dù - TEXT_INPUTKEY_DOWN làm.

+0

Tuy nhiên, bạn có thể lấy toàn bộ văn bản từ TextInput khi xử lý sự kiện CHANGE nếu bạn cần sử dụng kết quả cuối cùng cho một cái gì đó. –

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