提问人:ebyrob 提问时间:3/30/2017 最后编辑:ebyrob 更新时间:4/3/2017 访问量:2419
未在图像数据的 TextArea 上触发 OnPaste 事件
onpaste event not fired on textarea for image data
问:
我有一个工作页面用于上传描述。我添加了屏幕截图支持,该支持适用于 Firefox 52,并且应该适用于 Chrome。<textarea>
<input type="file">
onpaste
textarea
但是,在 IE 中,不会以非文本数据为重点触发。onpaste
<textarea>
HTML 测试页(为简洁起见,IE 仅):
<!DOCTYPE html><html><head><meta charset="UTF-8"/></head><body><form>
<script type="text/ecmascript">
function tb_pasted(e) {
document.getElementById('txtTest').value += ' evtfired ';
var s = "data: " + clipboardData.getData("Text") + "\n";
var numFinished = 0; var numStarted = 0;
for( var i=0; i<clipboardData.files.length; ++i ) {
++numStarted;
var file = clipboardData.files[i];
var fileReader = new FileReader();
fileReader.onload = function () {
var base64Data = fileReader.result
s += " s:" + file.size + " d:" + fileReader.result.substring(10, 30) + "\n";
++numFinished;
}
fileReader.readAsDataURL(file);
}
function alertWhenDone() {
if( numFinished >= numStarted ) alert(s);
else setTimeout(alertWhenDone, 100);
}
alertWhenDone();
return false;
}
</script>
nofire on image: <br/><textarea id="txtTest" onpaste="return tb_pasted(event);"></textarea>
<br/><br/>always fires: <br/><div id="divTest" contenteditable="true"
style="background-color:yellow; width:100px; height:100px;"
onpaste="return tb_pasted(event);"></div>
</form></body></html>
有没有办法无论如何都可以为“纯文本”字段触发,无论内容类型如何,或者我是否必须从此页面中删除所有文本字段?我已经阅读了有关用作文本输入的文章,这可能会起作用,但我希望有更好的方法。onpaste
<textarea>
<div/>
编辑:我试着从那里回来,这似乎根本没有帮助。以下不会在 IE 中为非文本触发粘贴事件:false
onbeforepaste
Enter some text:
<textarea id="txtTest"
onbeforepaste="alert('before paste'); return false;"
onpaste="alert('pasting'); return true;"
></textarea>
答:
1赞
ebyrob
3/30/2017
#1
啊哈!!! event 就是为这个问题而构建的。onbeforepaste
你会认为这就像从论坛回来一样简单,但这似乎并没有让活动火起来。false
onbeforepaste
<textarea>
onpaste
但是,如果您与非文本元素(如):return false
.focus()
<div>
nofire on image: <br/>
<textarea id="txtTest"
onpaste="return tb_pasted(event);"
fix="*** \/ ***"
onbeforepaste="document.getElementById('divTest').focus(); return false;"
fix="*** /\ ***"
></textarea><br/><br/>
always fires: <br/>
<div id="divTest" contenteditable="true"
style="background-color:yellow; width:100px; height:100px;"
onpaste="return tb_pasted(event);"></div>
然后似乎即使在IE中也可以工作。
0赞
Rob Parsons
4/2/2017
#2
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
html,body{
margin:0px;padding:0px;height:100%; background-color:black;
}
#divtoolbar{
position:fixed;
top:0;left:0;width:100%;
}
#divContent{
}
#preview{
}
img.obj{
max-width:320px;
}
img.obj.fullscreen{
max-width:none;width:auto;height:auto;margin:auto;overflow:visible!important;
}
ul{
padding:0px;list-style:none;background-color:black;
}
*:hover{
outline:red dotted thick;
}
</style>
<script type="text/javascript">
function toggleFullScreen(evt) {
var el=evt.target;
if (!document.fullscreenElement && // alternative standard method
!document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) { // current working methods
el.className='obj fullscreen';
el.oncontextmenu=function(){return false;}
if (el.requestFullscreen) {
el.requestFullscreen();
} else if (el.msRequestFullscreen) {
el.msRequestFullscreen();
} else if (el.mozRequestFullScreen) {
el.mozRequestFullScreen();
} else if (el.webkitRequestFullscreen) {
el.webkitRequestFullscreen(el.ALLOW_KEYBOARD_INPUT);
}
} else {
el.className='obj';
el.oncontextmenu=null;
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
evt.stopPropagation();
evt.preventDefault();
}
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
var imageType = /image.*/;
if (!file.type.match(imageType)) {
continue;
}
var img = document.createElement("img");
var el= document.createElement('li');
img.classList.add("obj");
img.file = file;
img.addEventListener('dblclick',toggleFullScreen,false);
el.appendChild(img)
preview.appendChild(el); // Assuming that "preview" is a the div output where the content will be displayed.
var reader = new FileReader();
reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result;aImg.scrollIntoView(true); }; })(img);
reader.readAsDataURL(file);
}
}
</script>
<title>filereader</title>
</head>
<body>
<div id="divtoolbar">
<input type="file" name="filselect" id="filselect" multiple accept="image/*,audio/*,video/*" style="width:100%" onchange="handleFiles(this.files);"/>
</div>
<div id="divContent">
<ul id="preview"></ul>
</div>
</body>
</html>
评论
0赞
ebyrob
4/3/2017
全屏与此有什么关系?正如我之前所说,我已经在此页面上进行了基本的文件上传。我的整个目标是让用户在文本字段中输入能够或屏幕截图,而不是打开图像编辑器、保存文件、单击查找文件等。Ctrl-V
right-click->Paste
browse...
0赞
Rob Parsons
4/4/2017
它在我手边的文件 api 测试页面中。您的原始问题和帖子显示您正在使用 <textarea> 元素。不是 file input 元素。
0赞
ebyrob
6/22/2017
是的,没错,我正在使用 a 创建一个“富文本”控件,其中我要接受粘贴的一种数据类型是文件数据(或文件描述符)。想想带有邮件正文的电子邮件表单,其中粘贴文件会变成附近的“额外”回形针。上面的代码只是一个简单的概念验证示例。textarea
textarea
上一个:如何增加最大标识符名称长度?
评论
<div>