I have a form that formats text which is input by several textfields, and I would like to make it possible for the user to type text, paste text, and drop text into the textfield. The JavaScript event is format()
.
onkeyup="format()
when a user types text and pastes text, but I can't figure out what event will allow a user to select text, drag and drop it over the textfield, and fire the event to automatically update the formatted text. I have tried ondrop
, onmouseup
, and onchange
all to no avail. I have a feeling that the onmouseup
property is working, but the problem is that the event fires right after the mouse is released, before the text textfield has the new user text, so it looks as if it didn't fire, when indeed it did, but there was nothing in the textfield. Could this be? If so, could I use setTimeout
to delay the event by 500 milliseconds (or something) until the text is there?
Here is the javscript:
<script language="JavaScript">
function format() {
var author = document.form.author.value;
var credentials = document.form.credentials.value;
var date = document.form.date.value;
var publication = document.form.publication.value;
var title = document.form.title.value;
var evidence = document.form.evidence.value;
var tagline = document.form.tagline.value;
document.getElementById('txtarea').innerHTML = ("<b>" + tagline + "</b>" + "</br >" + "<br />" + "<i>" + "<u>" + author + " " + date + "." + "</u> " + author + " (" + credentials + ") " + date + " " + publication + " " + title + " " + (window.top.getBrowser().selectedBrowser.contentWindow.location.href) + "</i>" + "<br />" + "<br />" + evidence);}
function clearForm() {
document.getElementById('txtarea').innerHTML = "";
}
</script>
Here is one of the 7 textfields that I have (I have the onkeyup
which covers type and paste, but I don't know what to use for drag and drop):
<form class="right_aligned" name="form" method="get" action="" id="form" onkeyup="format()" onmouseup="format()" ondrop="format()">
<div style="float: left;"><input ondblclick="this.value=''" type="text" name="publication" value="Publication..." id="publication" style="border:1px solid;border-color:#B0B0B0;width:225px;padding:4px;margin:10px;color: #000;"
ondrop="format()" ondragover="{this.value=''; this.style.color='#000';}" onfocus="if (this.value==this.defaultValue) {this.value=''; this.style.color='#000';}" onblur="if(this.value=='') {this.value=this.defaultValue; this.style.co开发者_如何学Pythonlor='#000';}"></div>
...and here is the contenteditable
div that the text is output to:
<div CONTENTEDITABLE id="txtarea" ondblclick="document.execCommand('selectAll',false,null);" style="float:left;overflow:auto;padding:5px;background-color:#FFF;border:1px solid;border-color:#B0B0B0;outline:none;width:213px;height:260px;font-size:.75em;margin-left:10px;margin-right:10px;margin-bottom:10px;margin-top:5px" type="text"></div>
By the way, this is for a Firefox extension, so cross browser is not an issue. It just has to work in Firefox.
There may be another way out there, but you can use setTimeout
with a 1 millisecond time and it seems to work just fine:
<p>Duis nunc nisl, luctus nec auctor id, iaculis eu nibh. Nunc odio velit, pretium et scelerisque eget, auctor eget erat. Cras id nulla nec odio vestibulum egestas ac in mi. Vivamus mollis suscipit condimentum. Sed laoreet eros ut lorem tempor porttitor. Etiam eget erat at lacus facilisis aliquam eget id purus.</p>
<br/>
<textarea ondrop="formatOnDrop(this)" onchange="formatOnChange(this)" id="textarea"></textarea>
<br/>
<input type="text" id="inputtext" ondrop="formatOnDrop(this)" onchange="formatOnChange(this)"/>
function formatOnDrop(el){
formatElement = el;
//alert('ondrop: ' + el.id + ' was changed to ' + el.value);
setTimeout(function(){format()},1);
}
function formatOnChange(el){
formatElement = el;
//alert('onchange: ' + el.id + ' was changed to ' + el.value);
setTimeout(function(){format()},1);
}
function format() {
alert('format: ' + formatElement.id + ' was changed to ' + formatElement.value);
}
http://jsfiddle.net/rREsh/3/
Note, the formatOnChange()
function is never called when selecting and dropping text, but it does fire onblur
when copying and pasting.
精彩评论