I'm going to look at different ways to manipulate textboxes using javascript. All of these examples are things I've had to use for various projects.
Here's what I'll cover:
- Selecting text on focus
- Creating a live preview
- Keyboard shortcuts (ie. ctrl+b to bold text)
- Advanced macros
Selecting Text On Focus
Let's start with the easy one. Here's the scenario: you have HTML code in a textbox that you want people to copy and paste. When the user clicks the textbox, the text should be highlighted.
<textarea onFocus='this.select();'>Click to select</textarea>Example:
Creating a Live Preview
Here's the scenario: You allow users to create their own html template. You want them to see a live preview of the rendered HTML code as they type.
First, the javascript.
//Puts html in the preview pane
function updatePreview(html) {
//Get preview element
target = document.getElementById('preview');
//Replace element's contents with passed text
target.innerHTML = html;
}
Now, the html.
<!--Text area that user types in--> <textarea onKeyUp='updatePreview(this.value);'></textarea> <!--Element where preview is displayed--> <div id='preview'></div>Example:
Keyboard Shortcuts
Here's the scenario: When a user fills out a textbox, you want their progress to be saved when they hit ctrl+s (Control + S), the standard keyboard shortcut for "save".
To actually save the data to a database, Ajax is required. I may get to this in a later tutorial, but for now, I'll assume you have a javascript function "saveData()" that does this. Here's the javascript.
//Find out which key is pressed
function interpretKey(e) {
//Get window event (handle different browsers)
e = (e) ? e : window.event;
//Get key code (handle different browsers)
key = (e.keyCode) ? e.keyCode : event.which;
if(e.ctrlKey) //Control Key is pressed
if(key==83) //S key is pressed
saveData(); //Save the data
}
And here's the HTML.
<textarea onKeyDown='interpretKey(event);'></textarea>Example:
Advanced Macros
A macro is a function that performs several tasks. They are often used to automate actions that humans repeatedly perform. I'm going to use the keyboard shortcuts we just made to preform macros.
Let's say you often type the following skeleton for an HTML file in a textfield:
<html> <head> <title>title</title> </head> <body> </body> </html>
You want to automate this so you don't have to type it every time. Let's make the keyboard shortcut "Alt+1" type this for you.
First, the javascript.
//Define array of macros
var macros = new Array;
//Define first macro
macros[0] = {
//Name of macro
"name":
"HTML Skeleton",
//Key that triggers Macro
"key":
49, // "1" key
//Text to insert into textbox
"text":
"<html>\n"+
"<head>\n"+
" <title>title</title>\n"+
"</head>\n"+
"<body>\n\n</body>\n"+
"</html>",
//Where to place cursor after inserting (from start of insert)
"cursor_offset":
52 //Places cursor 52 characters from start (Between the <body> tags)
};
function handleMacro(e) {
//Get window event (handle different browsers)
e = (e) ? e : window.event;
//Get key code (handle different browsers)
key = (e.keyCode) ? e.keyCode : event.which;
if(e.altKey) { //Alt Key is pressed, check for macros
for(i=0;i<macros.length;i++) {
if(macros[i].key == key) { //One of the macros matches the key pressed
//Do the macro
addText01(macros[i].text,macros[i].cursor_offset);
}
}
}
}
function addText01(text,offset) {
//Get textbox element
textbox = document.getElementById("textbox");
//Get current cursor position. This is where the text will be inserted.
cursorPosition = getCursorPosition(textbox);
if(cursorPosition==-1)
return false;
//Get the current text in the textbox
currentText = textbox.value;
//Generate new value with new text inserted
newText = currentText.substr(0,cursorPosition) + text + currentText.substr(cursorPosition);
textbox.value = newText;
//Get the new cursor position
if(offset || offset=='0') //Offset defined
newCursorPosition = offset;
else
newCursorPosition = text.length;
//Set the new cursor position
setCursorPosition(textbox,cursorPosition+newCursorPosition);
return true;
}
function getCursorPosition(node) {
//Firefox support
if(node.selectionStart) return node.selectionStart;
//Catch Exception (unsupported browser)
else if(!document.selection) return 0;
//IE support
//Define character to search for
var c = "\001";
//Create empty range
var sel = document.selection.createRange();
//Duplicate range
var dul = sel.duplicate();
var len = 0;
//Move duplicate range to node
dul.moveToElementText(node);
//Set selected value to character
sel.text = c;
//Search for character
len = (dul.text.indexOf(c));
//Delete character
sel.moveStart('character',-1);
sel.text = "";
//Return character position
return len;
}
function setCursorPosition (node, pos) {
// Firefox support
if (node.selectionStart || node.selectionStart == '0') {
node.selectionStart = pos;
node.selectionEnd = pos;
return;
}
// IE Support
// Create empty selection range
var sel = document.selection.createRange ();
// Move selection start and end to 0 position
sel.moveStart ('character', -node.value.length);
// Move selection start and end to desired position
sel.moveStart ('character', pos);
sel.moveEnd ('character', 0);
sel.select ();
}
Now for the HTML.
<textarea id='textbox' onKeyDown='handleMacro(event);'></textarea>
Using this technique, you can easily define multiple macros. For a list of javascript key codes, check out http://www.cambiaresearch.com/c4/702b8cd1-e5b0-42e6-83ac-25f0306e3e25/Javascript-Char-Codes-Key-Codes.aspx
Example:
1 comments:
Nice!! :D Thx.
Great script. Although those keyboard shortcuts don't work on my IE 7 browser. In FF they do :)
Post a Comment