我正在寻找一种清理粘贴到浏览器中的输入的方法,这可能与jQuery有关吗?
到目前为止,我已经设法解决了这个问题:
$(this).live(pasteEventName, function(e) {
// this is where i would like to sanitize my input
return false;
}
不幸的是,由于这个“小问题”,我的发展陷入了停顿。如果有人能指出正确的方向,我真的会让我成为一个快乐的露营者。
我正在寻找一种清理粘贴到浏览器中的输入的方法,这可能与jQuery有关吗?
到目前为止,我已经设法解决了这个问题:
$(this).live(pasteEventName, function(e) {
// this is where i would like to sanitize my input
return false;
}
不幸的是,由于这个“小问题”,我的发展陷入了停顿。如果有人能指出正确的方向,我真的会让我成为一个快乐的露营者。
Answers:
好吧,只是碰到了同样的问题..我走了很长一段路
$('input').on('paste', function () {
var element = this;
setTimeout(function () {
var text = $(element).val();
// do something with text
}, 100);
});
直到.val()函数可以填充之前,只有一小段超时。
E.
实际上,您可以直接从事件中获取价值。虽然有点难为情。
如果您不希望它通过,则返回false。
$(this).on('paste', function(e) {
var pasteData = e.originalEvent.clipboardData.getData('text')
});
e.clipboardData.getData('text')
使用普通的JavaScript。
为了实现跨平台兼容性,它应该处理oninput和onpropertychange事件:
$ (something).bind ("input propertychange", function (e) {
// check for paste as in example above and
// do something
})
我通过使用以下代码对其进行了修复:
$("#editor").live('input paste',function(e){
if(e.target.id == 'editor') {
$('<textarea></textarea>').attr('id', 'paste').appendTo('#editMode');
$("#paste").focus();
setTimeout($(this).paste, 250);
}
});
现在,我只需要存储插入符号的位置并将其附加到该位置,即可完成所有工作...我认为:)
input
导致差异:)我通常有这些在我的文本框的事件keyup keydown paste input
,但显然取决于你的动机是什么
嗯...我想您可以e.clipboardData
用来捕获正在粘贴的数据。如果没有成功,请在这里看看。
$(this).live("paste", function(e) {
alert(e.clipboardData); // [object Clipboard]
});
监听粘贴事件并设置一个keyup事件监听器。在keyup上,捕获值并删除keyup事件侦听器。
$('.inputTextArea').bind('paste', function (e){
$(e.target).keyup(getInput);
});
function getInput(e){
var inputText = $(e.target).val();
$(e.target).unbind('keyup');
}
$("#textboxid").on('input propertychange', function () {
//perform operation
});
它将正常工作。
这越来越接近您想要的东西。
function sanitize(s) {
return s.replace(/\bfoo\b/g, "~");
};
$(function() {
$(":text, textarea").bind("input paste", function(e) {
try {
clipboardData.setData("text",
sanitize(clipboardData.getData("text"))
);
} catch (e) {
$(this).val( sanitize( $(this).val() ) );
}
});
});
请注意,当未找到剪贴板数据对象时(在IE以外的浏览器上),您当前正在获取元素的完整值+剪贴板的值。
如果您确实只是在将真正的数据真正粘贴到元素之后,可以在输入之前和输入之后执行一些额外的步骤来区分这两个值。
$('').bind('input propertychange', function() {....});
这将适用于鼠标粘贴事件。
如何比较字段的原始值和字段的更改值,然后减去差异作为粘贴值?即使字段中存在现有的文本,这也会正确捕获粘贴的文本。
function text_diff(first, second) {
var start = 0;
while (start < first.length && first[start] == second[start]) {
++start;
}
var end = 0;
while (first.length - end > start && first[first.length - end - 1] == second[second.length - end - 1]) {
++end;
}
end = second.length - end;
return second.substr(start, end - start);
}
$('textarea').bind('paste', function () {
var self = $(this);
var orig = self.val();
setTimeout(function () {
var pasted = text_diff(orig, $(self).val());
console.log(pasted);
});
});
此代码对我有用,可以右键单击粘贴或直接复制粘贴
$('.textbox').on('paste input propertychange', function (e) {
$(this).val( $(this).val().replace(/[^0-9.]/g, '') );
})
当我粘贴时,Section 1: Labour Cost
它会出现1
在文本框中。
为了只允许浮点值,我使用此代码
//only decimal
$('.textbox').keypress(function(e) {
if(e.which == 46 && $(this).val().indexOf('.') != -1) {
e.preventDefault();
}
if (e.which == 8 || e.which == 46) {
return true;
} else if ( e.which < 48 || e.which > 57) {
e.preventDefault();
}
});
document.addEventListener('paste', function(e){
if(e.clipboardData.types.indexOf('text/html') > -1){
processDataFromClipboard(e.clipboardData.getData('text/html'));
e.preventDefault();
...
}
});
请参见以下示例:http : //www.p2e.dk/diverse/detectPaste.htm
它本质上使用oninput事件跟踪每个更改,然后通过字符串比较检查是否为粘贴。哦,在IE中有一个onpaste事件。所以:
$ (something).bind ("input paste", function (e) {
// check for paste as in example above and
// do something
})
此方法使用jqueries contents()。unwrap()。
在给定的超时后,扫描不具有您先前设置的类的所有内容展开标签。注意:此方法不会删除自闭标签,例如
参见下面的示例。
//find all children .find('*') and add the class .within .addClass("within") to all tags
$('#answer_text').find('*').each(function () {
$(this).addClass("within");
});
setTimeout(function() {
$('#answer_text').find('*').each(function () {
//if the current child does not have the specified class unwrap its contents
$(this).not(".within").contents().unwrap();
});
}, 0);
事实证明,这是非常虚幻的。在执行粘贴事件函数中的代码之前,不会更新输入的值。我尝试从粘贴事件函数中调用其他事件,但输入值仍未使用任何事件函数中的粘贴文本进行更新。那就是除按键之外的所有事件。如果您从粘贴事件功能中调用keyup,则可以从keyup事件功能中清除粘贴的文本。像这样...
$(':input').live
(
'input paste',
function(e)
{
$(this).keyup();
}
);
$(':input').live
(
'keyup',
function(e)
{
// sanitize pasted text here
}
);
这里有一个警告。在Firefox中,如果您重置每个键盘上的输入文本,如果文本长于输入宽度所允许的可视区域,则重置每个键盘上的值会破坏浏览器功能,该功能会自动将文本滚动到插入符号的插入位置。文字结尾。取而代之的是,文本会滚动回到开头,从而使插入符号不可见。
使用portlet-form-input-field类从所有字段中删除特殊字符的脚本:
// Remove special chars from input field on paste
jQuery('.portlet-form-input-field').bind('paste', function(e) {
var textInput = jQuery(this);
setTimeout(function() {
textInput.val(replaceSingleEndOfLineCharactersInString(textInput.val()));
}, 200);
});
function replaceSingleEndOfLineCharactersInString(value) {
<%
// deal with end-of-line characters (\n or \r\n) that will affect string length calculation,
// also remove all non-printable control characters that can cause XML validation errors
%>
if (value != "") {
value = value.replace(/(\x00|\x01|\x02|\x03|\x04|\x05|\x06|\x07|\x08|\x0B|\x0C|\x0E|\x0F|\x10|\x11|\x12|\x13|\x14|\x15|\x16|\x17|\x18|\x19|\x1A|\x1B|\x1C|\x1D|\x1E|\x1F|\x7F)/gm,'');
return value = value.replace(/(\r\n|\n|\r)/gm,'##').replace(/(\#\#)/gm,"\r\n");
}
}
这里有一个警告。在Firefox中,如果您重置每个键盘上的输入文本,如果文本长于输入宽度所允许的可视区域,则重置每个键盘上的值会破坏浏览器功能,该功能会自动将文本滚动到插入符号的插入位置。文字结尾。取而代之的是,文本会滚动回到开头,从而使插入符号不可见。
function scroll(elementToBeScrolled)
{
//this will reset the scroll to the bottom of the viewable area.
elementToBeScrolled.topscroll = elementToBeScrolled.scrollheight;
}