$('#sometextarea')
.change(function(){console.log($(this).val());})
[0].onpaste=function(){
var self=$(this);
var intr=setInterval(function(){
if(self.val().length) {
clearInterval(intr);
self.blur();
}
},10);
}
onpaste
在Opera中不起作用。
有人可以为这项任务提出更好的解决方案吗?
因为我不喜欢,我必须使用setInterval
/ setTimeout
并模拟更改事件。
因为如果使用triggerHandler('change')
导致第二个事件触发用户模糊,不知道为什么实际上,它不应该是理所当然的,因为数据在第一个triggerHandler('change')
之后没有改变
在用户退出textarea之前需要一个捕获val()
的解决方案,也应捕获鼠标粘贴。
答案 0 :(得分:2)
我知道派对的时间已经晚了,但我一直在努力在浏览器中捕获粘贴事件。我仍然在研究代码,但到目前为止我在http://jsfiddle.net/JgU37/42/。
代码的要点如下:
$(document).ready(function() {
// Fake paste
var doFakePaste = false;
$(document).on('keydown', function(e) {
$('#status').html('metaKey: ' + e.metaKey +
' ctrlKey: ' + e.ctrlKey +
' which: ' + e.which);
// These browser work with the real paste event
if ($.client.browser === "Chrome")
return;
if ($.client.os === "Windows" && $.client.browser === "Safari")
return;
// Check for patse keydown event
if (!doFakePaste &&
($.client.os === "Mac" && e.which == 86 && e.metaKey) ||
($.client.os !== "Mac" && e.which == 86 && e.ctrlKey)) {
doFakePaste = true;
// got a paste
if (!$("*:focus").is("input") &&
!$("*:focus").is("textarea")) {
$('#status').html('fake paste');
// Focus the offscreen editable
$('#TribblePaste').focus();
// Opera doesn't support onPaste events so we have
// to use a timeout to get the paste
if ($.client.browser === "Opera")
{
setTimeout(function() {
doFakePaste = false;
var html = $('#TribblePaste').html();
var text = $('#TribblePaste').text();
if (text == '') text = $('#TribblePaste').val();
$('#resultA').text('[o] '+html);
$('#resultB').text('[o] '+text);
$('#TribblePaste').val('');
$('#TribblePaste').text('');
$('#TribblePaste').blur();
}, 1);
}
}
}
}).on('paste', function (e) {
// Firefox is not supported - they don't
// expose the real clipboard
if ($.client.browser === 'Firefox')
return;
$('#status').html('paste event');
// real pasteing
var html = '';
var text = '';
if (window.clipboardData) // IE
{
text = window.clipboardData.getData("Text");
}
if (e.clipboardData && e.clipboardData.getData) // Standard
{
text = e.clipboardData.getData('text/plain');
text = e.clipboardData.getData('text/html');
}
if (e.originalEvent.clipboardData &&
e.originalEvent.clipboardData.getData) // jQuery
{
text = e.originalEvent.clipboardData.getData('text/plain');
html = e.originalEvent.clipboardData.getData('text/html');
}
$('#resultA').text(html);
$('#resultB').text(text);
});
// Setup the offscreen paste capture area
$('<textarea contenteditable id="TribblePaste"></textarea>').css({
'position': 'absolute',
'top': '-100000px',
'width': '100px',
'height': '100px'
}).on('paste', function(e) {
setTimeout(function() {
doFakePaste = false;
var html = $('#TribblePaste').html();
var text = $('#TribblePaste').text();
if (text == '') text = $('#TribblePaste').val();
$('#resultA').text(html);
$('#resultB').text(text);
$('#TribblePaste').val('');
$('#TribblePaste').text('');
$('#TribblePaste').blur();
}, 1);
}).appendTo('body');
$('#data').html('os: ' + $.client.os + ' browser: ' + $.client.browser);
});
答案 1 :(得分:1)
你不能,它根本不受支持。我能想到的唯一解决方法是使用setInterval
来检测这些变化。