|
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionThis article can be considered as a follow up to my former Modeling a Draggable Layer and Loading Dynamic Content to it via XML HTTP article. Have a look at it, if you have not done already so that you can catch up faster. In this article, we will try to
And best of all, we will do all these in less than 20 lines of code, with the help of sardalya API. Before starting, you may want to see the final result it in action first. Creating the ViewThe <div id="ModalBG"></div>
<div id="DialogWindow">
<div id="DialogHeader">
<span id="DialogTitle">Title comes here</span>
<img id="DialogActionBtn" src="icn_close.png" alt="close icon" title="" />
</div>
<div id="DialogIcon"><img id="DialogIcon" src="icn_alert.png" alt="alert icon" title="" /></div>
<div id="DialogContent">...</div>
</div>
"ModalBG" is a layer that is placed between the page content and the The CSSTo make our "DialogWindow" layer resemble an actual modal dialog, we need some Master.css
#DialogWindow
{
border: 1px #FFFFFF outset;
width: 550px;
display: none;
background: #FFFFFF;
z-index: 1000;
position: absolute;
top: 0;
left: 0;
}
#DialogContent
{
float: right;
margin-right: 10px;
margin-bottom: 10px;
margin-top: 24px;
width: 450px;
display: block;
font-size: 90%;
}
#DialogIcon
{
padding: 10px;
float: left;
}
#DialogHeader
{
border-bottom: 1px #00449E outset;
background: #00449E;
text-align: right;
}
#DialogTitle
{
float: left;
padding: 8px;
color: #FFFFFF;
}
#DialogActionBtn
{
cursor:pointer;
}
And we need an "Opacity.css" for transparency support: Opacity.css
#ModalBG
{
width:100%;
display:none;
background-color:#333333;
position:absolute;
top:0;
left:0;
height:100%;
z-index:999;
opacity:.40;
filter:alpha(opacity=40)
}
With the help of this Be Kind to OperaI hear you say "Why am I to be kind to Opera all the time? why is never Opera kind to me?!" and I truly understand you :) But let us be kind to Opera once again: To make our transparent background work on Opera we need several more Master.css
/* transparency support for Opera */
.modalOpera
{
background-image: url("maskBg.png") !important;
}
That's it! Opera does not understand There is one remaining issue here, we need to selectively apply this class only if and only if the user agent is Opera. That is other browsers, such as Mozilla, does not require this transparency hack and we should not use "modalOpera" class if our user agent is one of them. We will address this issue in a second. The ScriptFirst of all we need to prepare the Modal Dialog at page load: window.onload=function()
{
/* Sweep unnecessary empty text nodes. */
DOMManager.sweep();
/*
* Attach supporting css bind required
* classes for transparency support in Opera.
*/
addExtensionsForOpera();
/* Attach opacity css. */
attachOpacityCSS();
/* Adjust height. */
adjustHeight();
/* Create the modal dialog */
g_Modal=new ModalDialog("ModalBG","DialogWindow",
"DialogContent","DialogActionBtn");
/* Bind an event listener to double-click event. */
EventHandler.addEventListener(document,"dblclick",document_dblclick);
function addExtensionsForOpera()
{
/* classes for opera */
var ModalBG=new CBObject("ModalBG").getObject();
if(typeof(window.opera)!="undefined")
{
ModalBG.className="modalOpera";
}
}
function attachOpacityCSS()
{
/*
* CSS for opacity support
* Note that this can be directly added to the body.
* If you do not care about blindly adhering to standards
* you can directly include the rules into Master.css
*
* Do I care? Yes and No.(visit http://www.sarmal.com/Exceptions.aspx
* to learn how I feel about it).
*/
var opacityCSS = document.createElement("link");
opacityCSS.type="text/css";
opacityCSS.rel="stylesheet";
opacityCSS.href="Opacity.css";
document.getElementsByTagName("head")[0].appendChild(opacityCSS);
}
function adjustHeight()
{
/* get the available height of the viewport */
var intWindowHeight=WindowObject.getInnerDimension().getY();
var dynModalBG=new DynamicLayer("ModalBG");
var intModalHeight=dynModalBG.getHeight();
/*
* if modal background's height is less than the viewport's
* available height, increase its height.
*/
if(intModalHeight<intWindowHeight)
{
dynModalBG.setHeight(intWindowHeight);
}
}Then we create the modal dialog in just a single line:g_Modal=new ModalDialog("ModalBG","DialogWindow", "DialogContent","DialogActionBtn"); "ModalBG" is the ID of transparent background, "DialogWindow" is the ID of modal dialog container, "DialogContent" is where messages is displayed when calling the And finally we attach a double-click event to the document which will trigger an /* Bind an event listener to double-click event. */
EventHandler.addEventListener(document,"dblclick",document_dblclick);
Now let us have a look at function document_dblclick(evt)
{
/* create an AJAX request */
var ajax = _.ajax();
/*
* Note that _.ajax(); is a shorthand notation
* for new XHRequest();
* Visit http://sardalya.pbwiki.com/Shortcuts for details.
*/
/*
* You can add as many fields as you like to the post data.
* Normally the server will use this data to create an
* output that makes sense which may be an XML, a JSON String
* or an HTML String.
*/
ajax.removeAllFields();
ajax.addField("name","John");
ajax.addField("surname","Doe");
/* These events will be fired when server posts back a response. */
ajax.oncomplete=ajax_complete;
ajax.onerror=ajax_error;
/* Set a default waiting message. */
g_Modal.show("Fetching data... Please wait...");
/*
* Disable close action if you want to force the user
* to wait for the outcome of the AJAX request.
* Although it is generally not recommended
* this may be necessary at certain times.
*/
g_Modal.disableClose();
/* Post data to the server. */
ajax.get("externalScript.html");
/* Stop event propagation. */
new EventObject(evt).cancelDefaultAction();
}
The comments should be self-explanatory. And finally the two methods that are triggered after the server's post back. /* Triggered when a successful AJAX response comes from the server.*/
function ajax_complete(strResponseText,objResponseXML)
{
g_Modal.show(strResponseText);
/* Re-activate close button. */
g_Modal.enableClose();
}
/* Triggered when server generates an error. */
function ajax_error(intStatus,strStatusText)
{
g_Modal.show("Error code: ["+ intStatus+ "] error message: [" +
strStatusText + "].");
/* Re-activate close button. */
g_Modal.enableClose();
}
That's it! What about those nasty SELECTs ?
CSS of it for the sake of completeness:.modalWrap
{
border: 2px #ffffcc inset;
background:#ffffcc;
margin:5px;
}
You can add as many rules as you like to it. The more the For those who wonder how the replacement of those imho, transforming the ... And no, I do not want to use Here follows the code: _this._replaceCombos=function(blnReplaceBack)
{
var arSelect = document.getElementsByTagName("select");
var len=arSelect.length;
var objSel=null;
var strNodeValue="";
var objSpan=null;
var o=null;
if(!blnReplaceBack)
{
blnReplaceBack=false;
}
for(var i=0;i<len;i++)
{
objSel=arSelect[i];
strNodeValue=objSel.childNodes[objSel.selectedIndex
].childNodes[0].nodeValue;
objSpan=new CBObject(objSel.id+"_ModalWrap");
if(objSpan.exists())
{
o=objSpan.getObject();
o.parentNode.removeChild(o);
}
objSpan=document.createElement("span");
objSpan.id=objSel.id+"_ModalWrap";
objSpan.appendChild(document.createTextNode(strNodeValue));
objSpan.className="modalWrap";
objSel.parentNode.insertBefore(objSpan,objSel);
if(blnReplaceBack)
{
new DynamicLayer(objSpan).collapse();
new DynamicLayer(objSel).expandInline();
}
else
{
new DynamicLayer(objSpan).expandInline();
new DynamicLayer(objSel).collapse();
}
}
};
ConclusionIn conclusion, we modeled and created a draggableDHTML Modal dialog, established an AJAX connection to an external script; we did some cross-browser tweaks to make our application work on as many browsers as possible, and we did some OO coding.
And as always, History
| ||||||||||||||||||||||||||||