2012-02-29 34 views
24

Tôi có một chút rắc rối bắt một văn bản dán vào đầu vào của tôi:jquery như thế nào để có được nội dung dán

<input type="text" id="myid" val="default"> 
$('#myid').on('paste',function(){ 
     console.log($('#myid').val()); 
}); 

console.log cho thấy:

default 

Làm thế nào tôi catch văn bản dán và nhận được sẵn sàng sử dụng?

+1

Có một giải pháp đã được [jquery bắt dán đầu vào] [1] nhưng điều đó dường như tôi không phải là rất tốt một [1]: http : //stackoverflow.com/questions/686995/jquery-catch-paste-input – kingpin

+0

Tại sao điều này là bình luận ??? – kingpin

Trả lời

31

Trình duyệt hiện tại bây giờ hỗ trợ sự kiện input, mà sẽ cháy sau khi nội dung đã được dán

$('#myid').on('input', function() { 
    console.log($('#myid').val()); 
}); 

Khi dán vào một đầu vào sự kiện paste là bắn trước khi giá trị có thời gian để cập nhật.
Một cách để giải quyết này là để trì hoãn quá trình tìm nạp giá trị cho đến khi đầu vào đã có thời gian để cập nhật:

$('#myid').on('paste', function() { 
    setTimeout(function() { 
     console.log($('#myid').val()); 
    }, 100); 
}); 

Ngoài ra còn có khả năng nhận được các dữ liệu trực tiếp từ clipboard chứ không phải từ giá trị đầu vào, bằng cách truy cập event.clipboardData, tuy nhiên, kỹ thuật đó là thử nghiệm, không được hỗ trợ trong tất cả các trình duyệt và theo ý kiến ​​của tôi, việc sử dụng sự kiện input trở nên khó khăn hơn hoặc thậm chí là thời gian chờ đơn giản.

+1

Tại sao bạn thực hiện hết thời gian chờ là 100 mili giây, thay vì 0? – user2867288

+3

@ user2867288 - 4 năm sau, tôi không biết tại sao, tôi vừa làm vậy? – adeneo

+0

Chỉ cần tự hỏi nếu nó là bởi vì nó không hoạt động trong một số trình duyệt, nếu không (IE), bởi vì lý tưởng nhất hầu hết mọi người sẽ không muốn thêm vào sự chậm trễ không cần thiết vào ứng dụng web của họ. – user2867288

-3

Hãy thử điều này hoặc thêm một thời gian chờ quá:

$('#myid').on('paste',function(){ 
      console.log(this.value); 
    }); 
41

Câu trả lời được chấp nhận là thực sự hacky và xấu xí, dường như được gợi ý khá thường xuyên cho sự kiện dán trên stackoverflow. Tôi nghĩ rằng một cách tốt hơn để làm điều đó là this

$('#someInput').bind('paste', function(e) { 
    var data = e.originalEvent.clipboardData.getData('Text'); 
    //IE9 Equivalent ==> window.clipboardData.getData("Text"); 
}); 
+4

Điều này không hoạt động trong IE 9 đối với tôi, nhưng phương thức 'setTimeout' thực hiện. – BateTech

+3

window.clipboardData.getData ("Văn bản") <- IE9 tương đương với ở trên. –

+0

@toddv, đẹp nhất. – cateyes

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