|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
IntroductionI've been working on trying to set the focus of client side controls today and thought I'd submit this as I think it could be useful. I hope I haven't missed a method that is already built into ASP.NET that already does this. I've created a helper class that enables you to set the client side focus
with a single call. I decided against creating a subclass of the How it worked originallyAll that is required is the ID of the form which the control is in and the ID of the control itself. There are a couple of overloaded functions that automatically find these IDs depending on what type of server control you pass as a parameter. private void Page_Load(object sender, System.EventArgs e)
{
if( !this.IsPostBack )
{
McGiv.Web.UI.ClientSideFocus.setFocus(this.TextBox1);
this.ViewState["focus"] = "WebControl";
}
}
The JavaScript script is then generated and registered to the given The script itself makes a copy of the // save original function
if(document.body.onload)
original = document.body.onload;
// override original function
document.body.onload = document_onLoad;
function document_onLoad()
{
try
{
document.FormID.ControlID.focus();
}
catch(e){}
// call original function
original();
}
function original()
{
// do nothing if original is null
}
How it works nowAfter being notified that the original code could potentially steal
the focus of another window (which can be irritating), I switched from
using the var called = false;
if(document.body.onfocus)
orig_document_body_onfocus = document.body.onfocus;
document.body.onfocus = document_body_onfocus;
function setFocus()
{
var control = document.getElementById("html");
if(control)
control.focus();
}
function orig_document_body_onfocus(){}
function document_body_onfocus ()
{
if( !called )
{
called = true;
setFocus();
}
orig_document_body_onfocus();
}
if( window.__smartNav && window.__smartNav.restoreFocus)
{
orig_window__smartNav_restoreFocus = window.__smartNav.restoreFocus;
window.__smartNav.restoreFocus = window__smartNav_restoreFocus;
}
function orig_window__smartNav_restoreFocus(){}
function window__smartNav_restoreFocus()
{
setFocus();
orig_window__smartNav_restoreFocus
}
I’ve also tried to solve the problem with Smart Navigation by overriding
the I removed the need for the ID of the HTML form, as with most cases within ASP.NET, the page will only use one form. This modification alone removes about half the content from the original code. I’ve included the original code if you still need to reference the form's ID as well as the control ID. Known IssuesCurrently, the helper class doesn’t function properly when Smart Navigation is enabled. The demoI've included a simple demo that switches focus between a I use the viewstate to keep track of which control has focus. private void Button1_Click(object sender, System.EventArgs e)
{
string focus = this.ViewState["focus"] as string;
if( focus == null )
focus = "WebControl";
switch(focus)
{
case "Html":
{
McGiv.Web.UI.ClientSideFocus.setFocus(this.TextBox1);
this.ViewState["focus"] = "WebControl";
break;
}
case "HtmlControl":
{
McGiv.Web.UI.ClientSideFocus.setFocus(this, "html");
this.ViewState["focus"] = "Html";
break;
}
case "WebControl":
{
McGiv.Web.UI.ClientSideFocus.setFocus(this.HtmlControl1);
this.ViewState["focus"] = "HtmlControl";
break;
}
}
}
In order to get it to work, unzip the demo files into a virtual directory mapped to http://localhost/ClientSideFocus/. I've also setup an online demo here. Enjoy. Version History
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||