Ninja JavaScript Techniques
Download
Report
Transcript Ninja JavaScript Techniques
Applications of
JavaScript/DHTML
Quick tips to improve the usability
and scalability of your ColdFusionbased applications
Steve Drucker
CEO, Fig Leaf Software
Topics
Leveraging CFINPUT JS Validation
Routines
Performing in-context validation with hidden
frames
ColdFusion – JavaScript data binding
Client-side record sorting
JS/DHTML Grid Controls
Managing ColdFusion-based session
timeouts through JavaScript
Dynamic HTML context-menus
A custom tag for DHTML draggable dialog
boxes
Demo: Putting it all together
Using JavaScript for Data
Validation
ColdFusion’s CFFORM & CFINPUT
tags allow you to validate data types
for input boxes
Date
Eurodate
Social Security Number
Telephone Number
Integer
Floating Point
Credit Card
Time
Zipcode
Required
Regular Expressions (CF 5)
Code Sample of <CFFORM>
<CFFORM ACTION=“foo.cfm”>
Enter your name:
<CFINPUT TYPE=“text”
NAME=“name”
required=“Yes”
Message=“You must enter your name”>
Enter your date of birth:
<CFINPUT TYPE=“text”
NAME=“birthdate”
required=“Yes”
Validate=“Date”
Message=“You must enter your birth date in the format mm/dd/yyyy”>
<input type=“submit”>
</CFFORM>
Extending <CFFORM> with
the onSubmit attribute
The onSubmit attribute of CFFORM
allows you to invoke a JS function
after form validation has taken place
Extending <CFFORM> with
onSubmit
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
function fnValidate() {
if (document.forms[0].education.selectedIndex == 0) {
alert("You must select an education bracket");
return false;
}
}
</SCRIPT>
<CFFORM ACTION=“foo.cfm” onSubmit=“return fnValidate()”>
Select your level of education
<select name="education">
<option value="">Please Select
<option value="1">High School
<option value=“2”>Some College
<option value="5">I'm a freakin' rocket scientist!
</select>
<input type=“submit”>
</CFFORM>
In-context data validation
using a “hidden frame”
In some instances, you may need to
validate data against a database
without leaving the data entry
screen
Requires frames
You must pass information from
JavaScript to a ColdFusion page
Step 1: Defining a “hidden frame”
<frameset rows="*,0" border="0" frameborder="0" framespacing="0">
<frame name="appframe"
src="myform.cfm“
frameborder="0"
scrolling="Auto"
marginwidth="0"
marginheight="0">
<frame name="hiddenframe"
src="myform.cfm"
frameborder="0"
scrolling="0"
marginwidth="0"
marginheight="0">
</FRAMESET>
Step 2: Passing info from
JavaScript into ColdFusion
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!-function fnFindProduct(rowid,xval) {
parent.hiddenframe.location.href='lookup.cfm?row=' +
rowid + '&val=' + xval;
}
//-->
</SCRIPT>
<CFFORM … >
<cfinput type="text" name="productid” size="3"
validate="integer"
onChange="fnFindProduct(1,this.value)">
</CFFORM>
Step 3: Outputting a result
<CFQUERY NAME="qdata" datasource="ninjaJavascript">
select productname from product where productid =
#url.productid#
</CFQUERY>
<CFOUPTUT>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
parent.appframe.document.forms[0].productname.value =
'#jsStringformat(qdata.productname)#';
</SCRIPT>
</CFOUTPUT>
What is Data-Binding?
Data-binding involves taking information
from the ColdFusion server and making it
available to the browser in an easily
manipulated format.
Data-binding is typically achieved using
one of two techniques
Dynamically outputting JavaScript Objects
Using the Web Distributed Data Exchange
(WDDX) SDK (available at www.openwddx.org)
The advantages of databinding
“Live” data on the client can be
manipulated without making a
server-transaction
Faster “perceived” performance by
end-users
Less web traffic leads to enhanced
scalability
Transferring a CF Recordset to
JavaScript
<CFOUTPUT QUERY=“getbeans” datasource=“ninjaJavaScript”>
select bean_name,price_per_unit from beans
</CFOUTPUT>
<SCRIPT LANGUAGE=“JavaScript”>
function bean(bean_name,price_per_unit) {
this.bean_name = bean_name;
this.price_per_unit = price_per_unit;
}
var beans = new Array();
<CFOUTPUT QUERY=“getbeans”>
beans[#decrementvalue(getbeans.currentrow)#] = new
bean(‘#jsStringFormat(getbeans.bean_name)#’,#getbeans.price_per_unit#);
</CFOUTPUT>
</SCRIPT>
Sorting Records in JavaScript
<SCRIPT LANGUAGE=“JavaScript”>
function sortbeans(sorttype) {
if (sorttype==‘bean_name’) {
beans.sort(SortByBeanName);
} else {
beans.sort(SortByPricePerUnit);
}
}
function SortByBeanName (a,b) {
if (a.bean_name > b.bean_name)
return 1
else
return –1;
}
</SCRIPT>
Outputting Content in
JavaScript
Use the document.write() method
for maximum compatibility
Microsoft Internet Explorer allows
you to redraw sections of a page
using the innerHTML and
outerHTML methods
Outputting Records x-Browser
<SCRIPT LANGUAGE=“JavaScript”>
function drawtable() {
var xstr=“<html><body><table>”;
for (var I=0; I<beans.length; I++) {
xstr=xstr+’<tr><td>’ + beans[I].bean_name;
xstr=xstr+’</td><td>’ + beans[I].price_per_unit;
xstr=xstr+’</td></tr>’;
}
xstr+=‘</table></body></html>’;
parent.document.viewdataframe.open();
parent.document.viewdataframe.write(xstr);
parent.document.viewdataframe.close();
}
</SCRIPT>
Dynamically Changing Content in
Microsoft Internet Explorer
<SCRIPT LANGUAGE=“JavaScript”>
function drawtable() {
var xstr=“<table>”;
for (var I=0; I<beans.length; I++) {
xstr=xstr+’<tr><td>’ + beans[I].bean_name;
xstr=xstr+’</td><td>’ + beans[I].price_per_unit;
xstr=xstr+’</td></tr>’;
}
xstr+=‘</table>’;
document.all.results.innerHTML = xstr;
}
</SCRIPT>
<html><body><div id=“results”></div></body></html>
Code Walkthrough
Sorting Recordsets and a
demonstration of the <CF_iTable>
custom tag
Managing ColdFusion Session
Timeouts
The default installation of CF sets
session timeouts to 20 minutes
Unfortunately, the timeout can activate
prior to a user submitting a complex form,
long data entry task, etc.
You can use JavaScript to proactively
warn an end-user about an impending
timeout
The setTimeout method
JavaScript has a method called
setTimeout that will execute a javascript
expression after a specified number of
miliseconds.
Use setTimeout to invoke a warning
message prior to session timeout.
After the countdown timer expires, you
can redirect the user to a logon page,
thereby securing any content that may
have been left on-screen.
Setting timeout on a page
<html>
<head>
<script language=“JavaScript”>
function fntimeout() {
showModelessDialog("timeout.htm",window,
"status:false;dialogWidth:300px;dialogHeight:300px");
}
</SCRIPT>
</head>
<body onLoad="setTimeout('fntimeout()',5000)">
Presenting the user with a
countdown timer/autologoff
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
function fnclear() {
window.dialogArguments.document.location.href='http://www.figleaf.com';
window.close()
}
</SCRIPT>
<body onLoad="setTimeout('fnclear()',5000)">
Danger Will Robinson!
You will lose all your work if you don't save!
<input type="button"
onClick="window.dialogArguments.document.forms[0].submit()" value="Click here
to submit">
DHTML in-context menus
Left/Right Clicking on an Object
displays a menu
Hiding/showing objects in the browser
Tracking Mouse Movements
Dynamically moving objects on the
page
OnContextMenu events
Creating the visual “exploding menu”
effect
Showing/Hiding objects in
browsers
Microsoft Internet Explorer
document.all.objname.style.display=‘none’
document.all.objname.style.display=‘’;
document.all.objname.style.visibility=‘hidden’
document.all.objname.style.visibility=‘visible’
Netscape Navigator 4.x
Move layers to a negative pixel coordinate
document.layername.moveTo(-200,-200)
Key Technique:
Tracking Mouse Movement
Microsoft Internet Explorer
Use the EVENT properties to inspect
mouse disposition
event.clientX, event.clientY
Netscape Navigator 4.x
Use obj.pageX, obj.pageY
Use event capturing
Key Technique:
Moving objects on screen
Microsoft Internet Explorer
Set the top and left coordinates of an
object
document.all.objname.style.top
document.all.objname.style.left
Netscape Navigator
Move layers
document.layername.moveTo(x,y)
Right Mouse Context Menu
(MSIE)
<SCRIPT FOR = document EVENT = oncontextmenu>
document.oncontextmenu = fnContextMenu;
<SCRIPT>
<SCRIPT>
function fnContextMenu(){
event.returnValue = false; // cancel the default behavior
}
</SCRIPT>
Key Technique:
Menu “Flyout” Animation
function doresize(h,w) {
document.all.menubar.style.height=h;
document.all.menubar.style.width=w;
}
function fnShowmenu() {
document.all.menubar.style.top = event.clientY;
document.all.menubar.style.left = event.clientX;
document.all.menubar.style.display='';
for (var i=1; i<200; i++) {
setTimeout("doresize(" + i + "," + i + ")",i*2);
}
document.all.menuoptions.innerHTML = '<A HREF="http://www.figleaf.com">Click here</A>'
}
Code Walkthrough:
DHTML Context-Sensitive
Navigation
Creating Draggable Layers
Use Dreamweaver MX to generate
x-browser compatible code
Inserting an IFRAME into a
draggable layer has the net effect of
a draggable window
Demo
Drag and Drop in Dreamweaver
MX
Demo: Putting it all together
Summary
Knowing just a few key
JavaScript/DHTML techniques can
take you a very long way.
Questions?
Steve Drucker
[email protected]
http://www.figleaf.com
http://training.figleaf.com
http://www.cfugorama.com
Book Resources
Anything by Danny Goodman or
David Flannagan