UpdatePanel触发javascript脚本的方法附代码

一.预呈现数据无法更改

  1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自定义一个控件

[DefaultProperty("Text")]

[ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")]

public class JsControl : WebControl

{

[Bindable(true)]

[Category("Appearance")]

[DefaultValue("")]

[Localizable(true)]

 public string Text

 {

 get

 {

 String s = (String)ViewState["Text"]; 

 return ((s == null) ? String.Empty : s); 

 }

  set

 {

  ViewState["Text"] = value; 

  }

}

 protected override void OnPreRender(EventArgs e)

 {

 Text = "hello,you can't change me"; 

 base.OnPreRender(e); 

 }

 protected override void RenderContents(HtmlTextWriter output)

 {

 output.Write(Text); 

 }

}

aspx页面

protected void Button1_Click(object sender, EventArgs e)

{

JsControl1.Text = "I want to change the Text property"; 

}

  你会发现你并未更改属性.这牵涉到控件生命周期的执行.为什么要说这个,因为控件的大部分脚本都是在预呈现中注册的.

  这有什么问题吗? 其本身想法很好,脚本在此事件(指OnPreRender)中注册,注册脚本资源在前(控件夹中间),脚本初始化在最后.这符合javascript的使用原则,先导入脚本,然后有标签,初始化的脚本须放在标签后面.

  二.UpdatePanel引起的问题

  上面的问题如果是服务器提交回传的则可行,主要问题是我们要用ajax无刷新注册脚本.以下我们再来看asp.net2.0内置的treeview控件,拖个控件要页面看其生成的html代码。

  你已经看到很多的脚本注册和初始化了.

  我们来测试下UpdatePanel能干什么事情,我们设置其属性Visible为False到True

  借助FireBug的威力我们来看下UpdatePanel在无刷新状态下返回给了我们什么

 

  出错了,大家可能也遇到过此情况,很正常嘛,UpdatePanel没有为我们注册脚本也没未我们初始化,在属于正常现象,UpdatePanel只管其容器里面的,其他的不归它管.

  三.解决方法

  要解决TreeView控件,我是想不出来,这个控件算是在asp.net ajax模式下算是完蛋了.为了迎合asp.net ajax框架的运用,我们需要知道UpdatePanel无刷新更新范围,当我们自己定义控件的时候就需要注意.

1.控件本身标签

2.控件内部

3.UpdatePanel容器内部

  若想使用UpdatePanel更新数据后再触发客户端事件的,有以下方案

  1.通过更改现有控件属性,如

Button1.Attributes["onmouseover"] = "alert('hello')"; 

  2.在呈现过程中脚本初始化

  第一种方法简单运用还可以,复杂就不行了,我们还是需要把脚本封装好跟控件结合使用的,我们不再在预呈现中注册脚本,而在呈现中实现(即RederContent方法).

我们只要保证脚本资源在前,初始化在后,控件在中间这一原则就可以了...以下方法是可行的

如下

protected override void RenderContents(HtmlTextWriter output)

{

output.Write("<script src=\"xxxx.js\"></script>"); 

output.Write(Text); 

output.Write("<script>alert('hello')</script>"); 

}

  四.几个误区

  1.验证控件在ajax框架中可以完好使用

其实是其加载了一段脚本,不然其也会挂掉

  2.状态保留

  在UpdatePanel中更新数据后,再Postback,无刷新更新的数据状态还保留

  3.更新数据后执行客户端脚本

曾经我们天真的会这么写

protected void Button1_Click(object sender, EventArgs e)

{

Label1.Text = "alert('hello')"; 

}

  结果什么也没发生,window.onload事件已过,除非你刷新(可你不想刷新),不然没人帮你触发。

  谁来触发?微软帮我们准备好了。你要的大概就是这个了,数据更新前后都是一个事件触发。我们可以围绕着这两个事件为控件做点事情。这个状态适合于数据取到后就立马触发的需要。

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 

 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 

 function BeginRequestHandler(sender, args)

 {

 var elem = args.get_postBackElement(); 

 ActivateAlertDiv('visible', 'AlertDiv', elem.value + ' processing'); 

 }

 function EndRequestHandler(sender, args)

 {

 ActivateAlertDiv('hidden', 'AlertDiv', ''); 

 }

 function ActivateAlertDiv(visstring, elem, msg)

 {

 var adiv = $get(elem); 

 adiv.style.visibility = visstring; 

 adiv.innerHTML = msg; 

 }

  其他的话我们也可以更改控件属性,就如加个onclick事件什么的都可以

  五.另类解决方法

此方法比较的绝,但用起来比较的爽。UpdatePanel之所以无法获取到脚本数据,是因为其获取范围还不够。。。接着的想法是:

  照样无刷新取数据,但取回来的数据跟Postback回来的数据一样。

可能有人说会比较耗性能,那都是相对的。不过也是一个很好的想法。Telerik公司的RadAjaxPanel就是这么实现的,有兴趣的可以下载一个用用

时间: 2024-09-27 04:19:00

UpdatePanel触发javascript脚本的方法附代码的相关文章

UpdatePanel触发javascript脚本的方法附代码_应用技巧

一.预呈现数据无法更改 1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自定义一个控件 [DefaultProperty("Text")] [ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")] public class JsControl : WebControl { [Bindable(true)] [Category("Appeara

UpdatePanel触发javascript脚本技巧

相信很多同志都已经遇到这个问题了.这个本身不奇怪.下面我们来具体讨论 此问题. 一.预呈现数据无法更改 1.大家知道,预呈现的数据是无法更改的,以前可能提到过,这里再看demo,自 定义一个控件 [DefaultProperty("Text")] [ToolboxData("<{0}:JsControl runat=server></ {0}:JsControl>")] public class JsControl : WebControl

(转)ASP.NET调用javascript脚本的方法总结

1.直接在前台调用 javascript 函数   很简单,在 head 元素之间加入 script 元素,将 type 元素设置为 " text/javascript " 如: <head runat="server"><script type="text/javascript" >function ShowName(str){alert("您的名字为:("+str+")");}&

探析浏览器执行JavaScript脚本加载与代码执行顺序_javascript技巧

本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析和执行时具有阻塞的特性,也就是说,当JavaScript代码执行时,页面的解析.渲染以及其他资源的下载都要停下来等待脚本执行完毕①.这一点是没有争议的,并且在所有浏览器中的行为都是一致的,原因也不难理解:浏览器需要一个稳定的DOM结构,而JavaScript可能会修改DOM(改变DOM结构或修改某个

按Enter键触发事件的jquery方法实现代码

 这篇文章主要介绍了按Enter键触发事件的jquery方法,需要的朋友可以参考下  代码如下: $(function () {  document.onkeydown = function (event) {  var e = event || window.event || arguments.callee.caller.arguments[0];  if (e && e.keyCode == 13) {  //to do something;  }  };  });     

MongoDB服务端JavaScript脚本使用方法_MongoDB

常用JavaScript语句 复制代码 代码如下: db.getSiblingDB(<dbname>)   db.getCollectionNames()    db.getCollection(<collname>)    db.printCollectionStats() 在mongo shell运行JavaScript脚本   切换数据库:   复制代码 代码如下: use <dbname> 运行如下脚本: var total = 0; var dbaStatCo

快速掌握WordPress中加载JavaScript脚本的方法_javascript技巧

在 WordPress 中加载脚本(为 CSS 和 JS,下同)文件,大多数人的做法是直接在 header.php 文件中添加 link 标签,或者把 link 标签通过 wp_head 钩子直接添加到 head 标签里,这种做法是不符合官方规范的. 标准的脚本加载方式应该是使用 WordPress 官方提供的函数(后边会说),统一标准有几个好处,首先就是更加安全和利于管理,其次是更加的方便快捷,而且不仅主题能挂载脚本,插件也可以,并且还能管理脚本,并且调整挂载顺序和位置和其它内容. 在哪个钩子

javascript脚本调试方法小结_javascript技巧

1. alert方法 这也是十分原始的方法,但调试起来十分麻烦. 2. debugger方法 首先打开Internet选项--高级,将"禁用脚本调试(Internet Explorer)"的勾去掉 如果想其他浏览器也启用调试,那么可以把"禁用脚本调试(其他)"的勾也去去掉. 然后在你想需要地方进行调试,就加入debugger,如 <script type="text/javascript"> debugger; var s="

在ASP.NET中使用JavaScript脚本的方法_javascript技巧

一)简单点的如要在一个按钮上增加认证脚本,可以这样 复制代码 代码如下: <%@ Page Language="C#" %><SCRIPT language="javascript"> function getconfirm (){    if (confirm("Do you want to delete record?")==true)     return true;    else    return false;