在asp.net中的onfocus_doPostBack之后保持焦点
Maintain Focus after onfocus__doPostBack in asp.net
当用户点击文本框时,我必须执行服务器端事件。到目前为止,我可以使用onfocus事件调用javascript函数,但如果我尝试删除onfocus,执行一些代码,将焦点放回控件上,那么它会在无限循环中再次触发onfocus活动。下面的示例。。。
Html
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" onfocus="CallServer(this);"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True" onfocus="CallServer(this);"></asp:TextBox>
Javascript
function CallServer(obj) {
if (obj != "") {
var control = document.getElementById(obj.id)
__doPostBack(obj.id, "onfocus");
}
}
编码背后
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack Then
Dim target As String = Page.Request.Params.Get("__EVENTTARGET")
Dim eventarg As String = Page.Request.Params.Get("__EVENTARGUMENT")
Dim PostControl As Control = Nothing
If target <> "" Then
PostControl = Page.FindControl(target)
End If
If eventarg = "onfocus" Then
CType(PostControl, TextBox).Attributes("onfocus") = "null"
...do some code
Page.SetFocus(PostControl)
CType(ctrl, TextBox).Attributes.Add("onfocus", "CallServer(this)")
End If
End If
End Sub
您可以通过使用Page_PreRender中的ScriptManager.SetFocus来实现这一点。本例中的ScriptManager位于MasterPage中。
Private Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
If HiddenFieldPostBackControl.Value <> "" Then
Dim PostBackControl As Control = FindControlById(HiddenFieldPostBackControl.Value)
If PostBackControl IsNot Nothing Then
Dim sm As ScriptManager = ScriptManager.GetCurrent(Master.Page)
sm.SetFocus(PostBackControl )
End If
End If
End Sub
注意:如果使用的是动态控件(每次回发时都必须重新创建),则必须删除目标控件的(OnFocusIn的OnFocus)事件,同时将该事件添加到其他控件。这必须在Page_PreRender之前完成。
function ControlOnFocus(ctrl, request, doc, min, max, docSec) {
if (ctrl != "") {
var hf = document.getElementById("MainContent_HiddenFieldPostControl").value = ctrl.id;
var c = document.getElementById(ctrl.id);
PostControl = ctrl;
//ONFOCUS
if (request.toLowerCase() == 'server') {
//SERVER Handler
__doPostBack(ctrl.id, "onfocus");
} else {
//CLIENT Handler
//Your code here...
}
ReAssignEvent(ctrl.id);
var hf = document.getElementById("MainContent_hfValidated");
hf.innerText = "";
};
};
function ReAssignEvent(ControlID) {
//loop through an array with (id,onfocus event) for each control
//this array is only required for the focus event
for (var i = 0; i < FocusArray.length; i++) {
var carr = FocusArray[i].split("[1]"); //split the element to get id and event
var carrId = carr[0]; //get the id
var c = document.getElementById(carrId); //find control and assign control to var
var e = carr[1]; //assing event as string to var
if (c != null) {
if (ControlID!= carrId) {
if (c.type == "text" || c.type == "select-one") {
c.setAttribute("onfocus", e);
} else {
c.setAttribute("onfocusin", e);
}
} else {
if (c.type == "text" || c.type == "select-one") {
c.removeAttribute("onfocus");
} else {
c.removeAttribute("onfocusin");
}
}
}
}
}
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 单击时将焦点更改为元素
- 在chrome.tabs.onCreated之后加载HTML页面
- 在Jquery detachment()和appendTo()之后定位元素
- AngularJS:ng之后,重复$scope值未按预期更新
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- 在jAlert之后设置焦点
- 在jquery/javascript的输入框中的特定项目之后设置焦点
- 我希望只有在文本字段的焦点之后才能进行验证
- 剑道UI输入焦点-在选择和Ajax调用之后,下拉列表保留焦点
- 即使在javascript中设置了焦点之后,Tab事件也会改变焦点
- 使用jquery将文本字段的焦点放在其值之后
- 将插入符号设置为在焦点CKEditor之后结束
- 尝试将焦点设置在表单元素的id上,使用在警报消息之后,但是JSP页面提交
- 获得“previous"选项卡之后有焦点的元素
- 在asp.net中的onfocus_doPostBack之后保持焦点
- 焦点事件在函数内部的焦点之后触发
- 将焦点设置为 JSF 的更改值侦听器之后的下一个输入元素
- 文本框中的焦点不在FF中的警报之后