客户端脚本一般都在前台,这里讲的是(1)在后台调用前台定义的脚本(2)在后台如何注册客户端脚本

用途

何时使用服务器代码向页中添加客户端脚本:

u 当客户端脚本的内容依赖于直到运行时才可用的信息时

u 当您希望客户端脚本在当页已完成加载或当用户提交页时执行

方法

(一)用Response.Write方法写入脚本

比如在你单击按钮后,先操作数据库,完了后进行弹出框提示Response.Write("<scripttype='text/javascript'>alert();</script>");

缺陷:这个方法不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定义,比如Response.Write("<scripttype='text/javascript'>function myfun(){alert('a')}</script>");

(注意,后一个response方法与前一个不同,不会立即弹出框,因为它只是注册了一个客户端脚本函数,并不会执行该函数,所以只有调用myfun()函数时才会弹出框)

(二)通过Page 对象的 ClientScript 属性获取对 ClientScriptManager 类的引用以动态注册、调用客户端脚本

ClientScriptManager类简介:ClientScriptManager 类用于管理客户端脚本并将它们添加到Web 应用程序中,通过键 String 和 Type 唯一地标识脚本。具有相同的键和类型的脚本被视为重复脚本。使用脚本类型有助于避免混淆可能用在页中的来自不同用户控件的相似脚本托福答案 www.qcwy123.com

(1)方法ClientScriptManager.RegisterStartupScript(Type type, String key , String script)

参数

type:要注册的启动脚本的类型(一般直接填this.GetType()即可)。

key:要注册的启动脚本的键(相当于为执行脚本起一个名字,任意名即可)。

script:要注册的启动脚本文本("<script>函数()</script>",函数()可以为系统函数也可以为前台定义的js函数)。

- 客户端脚本由它的键(key)和类型(type)唯一标识。具有相同的键和类型的脚本被视为重复脚本。

- 调用 IsStartupScriptRegistered 方法以确定具有给定的键和类型对的启动脚本是否已经注册,从而避免不必要的添加脚本尝试。

- RegisterStartupScript 方法添加的脚本块在页面加载完成但页面的 OnLoad 事件引发之前执行

举例:

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="RegisterStartupScript.aspx.cs" Inherits="WebApplication4.WebForm12" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title></title>

<script type="text/javascript">

function test() {

alert("前台定义的客户端脚本");

}

</script>

</head>

<body>

<form id="form1" runat="server">

</form>

</body>

</html>

后台代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebApplication4

{

public partial class WebForm12 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

//从 Page 对象的 ClientScript 属性获取对 ClientScriptManager 类的引用

ClientScriptManager cs = Page.ClientScript;

//方法中直接嵌入脚本,有弊端

Response.Write("<script>alert('方法中直接嵌入脚本');</script>");

//ClientScript直接在后台注册客户端脚本

String csname1 = "PopupScript1";

Type cstype = this.GetType();

//判断startup script是否已被注册

if (!cs.IsStartupScriptRegistered(cstype, csname1))

{

String cstext1 = "alert('后台定义的客户端脚本');";//后台定义客户端脚本

cs.RegisterStartupScript(cstype, csname1, cstext1, true);

}

//ClientScript调用前台定义的客户端脚本

String csname2 = "PopupScript2";

//判断startup script是否已被注册

if (!cs.IsStartupScriptRegistered(cstype, csname1))

{

String cstext2 = "test();";//test()为前台定义的客户端脚本

cs.RegisterStartupScript(cstype, csname2, cstext2, true);

}

//ClientScript.RegisterStartupScript(Type type,string key ,string script)方法

string csname3 = "PopupScript3";

//判断startup script是否已被注册

if (!cs.IsStartupScriptRegistered(cstype, csname1))

{

String cstext3 = "<script>test();</script)";

cs.RegisterStartupScript(cstype, csname3, cstext3);

}

}

}

}

注:重载方法 ClientScript.RegisterStartupScript(Typetype,stringkey, string script,bool flag)

多了一个参数:addScriptTags

指示是否添加脚本标记的布尔值,指示 script 参数中提供的脚本是否包装在 <script> 元素块中。将 addScriptTags 设置为 true 指示脚本标记将自动添加。设置为 false,所以脚本开始标记和结束标记包含在 script 参数中。

(2)方法 ClientScriptManager.RegisterClientScriptBlock(Type, String, String)

参数与重载方法与方法一很类似,不多介绍

- 向页的顶部添加一个脚本块。以字符串形式创建脚本,然后将其传递给方法,方法再将脚本添加到页中。

- 可以使用此方法将任何脚本插入到页中。请注意,脚本可能在所有元素完成之前呈现到页中;因此,您可能无法从脚本中引用页上的所有元素。

- 调用 IsClientScriptBlockRegistered 方法以确定具有给定的键和类型对的客户端脚本是否已经注册,从而避免不必要的添加脚本尝试

使用方法与方法一也大致相同,直接看实例:

后台代码(注册客户端脚本):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Text;

namespace WebApplication4

{

public partial class WebForm13 : System.Web.UI.Page

{

public void Page_Load(Object sender, EventArgs e)

{

// 定义参数变量

String csname1 = "PopupScript";

Type cstype = this.GetType();

// 从 Page 对象的 ClientScript 属性获取对 ClientScriptManager 类的引用

ClientScriptManager cs = Page.ClientScript;

// 判断startup script是否已被注册

if (!cs.IsClientScriptBlockRegistered(cstype, csname1))

{

//运用StringBuilder需要导入using System.Text命名空间

StringBuilder cstext2 = new StringBuilder();

//注册客户端脚本,由前台调用

cstext2.Append("<script type=text/javascript> function DoClick() {");

cstext2.Append("alert('hello')} </");

cstext2.Append("script>");

cs.RegisterClientScriptBlock(cstype, csname1, cstext2.ToString(), false);

}

//调用前台定义的脚本与方法一类似,不做介绍

}

}

}

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="RegisterClientScriptBlock.aspx.cs" Inherits="WebApplication4.WebForm13" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>ClientScriptManager Example</title>

</head>

<body>

<form id="Form1"

runat="server">

<%--调用后台注册的客户端脚本--%>

<input type="button" value="ClickMe" onclick="DoClick()"/>

</form>

</body>

</html>

(3)方法ClientScriptManager.RegisterClientScriptInclude(Stringkey, String src)

参数

key:要注册的客户端脚本包含的键。

url:要注册的客户端脚本所在的js文件的URL.

- 调用 IsStartupScriptRegistered 方法以确定具有给定的键和类型对的客户端脚本包含是否已经注册

- 与 RegisterClientScriptBlock 方法类似,但此方法将添加引用外部 .js 文件的脚本块。包含文件在任何其他动态添加的脚本之前添加;因此,您可能无法引用页上的某些元素。(重载方法不多说)

直接看实例:

testJs.js文件中的代码:

function testFun(){

alert("这是独立的js文件中得客户端脚本");

}

后台代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebApplication4

{

public partial class RegisterClientScriptInclude : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

//定义参数变量

String csname = "ButtonClickScript";

String csurl = "~/testJs.js";

Type cstype = this.GetType();

// 从 Page 对象的 ClientScript 属性获取对 ClientScriptManager 类的引用

ClientScriptManager cs = Page.ClientScript;

// 判断script是否已被注册

if (!cs.IsClientScriptIncludeRegistered(cstype, csname))

{

//在后台注册客户端脚本

cs.RegisterClientScriptInclude(cstype, csname, ResolveClientUrl(csurl));

}

//当然可以用RegisterStartupScript方法直接调用js文件代码,如下

ClientScript.RegisterStartupScript(this.GetType(), "csname2", "testFun()", true);

}

}

}

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="RegisterClientScriptInclude.aspx.cs" Inherits="WebApplication4.RegisterClientScriptInclude" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title></title>

不必用下面的语句在前台注册testJs.js脚本文件,已在后台注册

<%--<script src="testJs.js" type="text/javascript">

</script>--%>

</head>

<body>

<form id="form1" runat="server">

<div>

<%--调用后台注册的testJs.js文件中的脚本--%>

<input type="button" value="ClickMe" onclick="testFun()"/>

</div>

</form>

</body>

</html>

(4)方法ClientScriptManager.RegisterOnSubmitStatement(Type type,String key, String script)

- 添加响应页的 onsubmit 事件而执行的脚本。

- 调用 IsOnSubmitStatementRegistered 方法可确定某 OnSubmit 语句是否已通过给定的键/类型对注册,从而避免不必要地添加脚本的尝试。

- RegisterOnSubmitStatement 方法的 script 参数可以包含多个脚本命令,只要它们以分号 (;) 正确地分隔。

- RegisterOnSubmitStatement 添加一个脚本,该脚本在页面提交前执行并提供取消提交的机会。

实例:

后台代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebApplication4

{

public partial class RegisterOnSubmitStatement : System.Web.UI.Page

{

public void Page_Load(Object sender, EventArgs e)

{

// 定义参数变量

String csname = "OnSubmitScript";

Type cstype = this.GetType();

// 从 Page 对象的 ClientScript 属性获取对 ClientScriptManager 类的引用

ClientScriptManager cs = Page.ClientScript;

// 判断script是否已被注册

if (!cs.IsOnSubmitStatementRegistered(cstype, csname))

{

String cstext = "document.write('Text from OnSubmit statement');";

cs.RegisterOnSubmitStatement(cstype, csname, cstext);

}

}

}

}

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="RegisterOnSubmitStatement.aspx.cs" Inherits="WebApplication4.RegisterOnSubmitStatement" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title></title>

</head>

<body>

<form id="form1" runat="server">

<%--定义sumit按钮,点击提交页面,以触发后台注册的脚本--%>

<input type="submit" value="Submit"/>

</form>

</body>

</html>

(三)向 asp.net web服务器控件添加客户端脚本事件 以编程方式向 ASP.NET 控件添加客户端事件处理程序

#在页面的 Init 或 Load 事件中调用控件的 Attributes 集合的 Add 方法托福答案 www.tfjy386.com

向按钮控件添加客户端 Onclick 事件

#在按钮控件(Button、LinkButton 和 ImageButton 控件)中,将 OnClientClick 属性设置为要执行的客户端脚本

举例:

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testServerControls.aspx.cs" Inherits="WebApplication4.testServerControls" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title></title>

<script type="text/javascript">

function test() {

alert("hello new world");

}

</script>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Button ID="btnServer" runat="server" Text="Button"/>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<span id="spanCounter"></span>

</div>

</form>

</body>

</html>

后台代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebApplication4

{

public partial class testServerControls : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

//将客户端按钮控件的属性设置为客户端脚本test()

btnServer.OnClientClick = "test()";

//调用控件的 Attributes 集合的 Add 方法

String displayControlName = "spanCounter";

//在span中显示文本框的字符长度

TextBox1.Attributes.Add("onkeyup", displayControlName + ".innerText=this.value.length;");

}

}

}

总结

因为js非常灵活强大,我们往往在后台需要用到它的方法;当客户端脚本的内容依赖于直到运行时才可用的信息时;当您希望客户端脚本在当页已完成加载或当用户提交页时执行;都会用到后台调用或注册客户端脚本的技术。

以上是总结的后台注册、调用客户端脚本的方法,请参考…

js前台与后台数据交互的更多相关文章

  1. js前台与后台数据交互-前台调后台

    转自:http://blog.csdn.net/wang379275614/article/details/17033981   网站是围绕数据库来编程的,以数据库中的数据为中心,通过后台来操作这些数 ...

  2. js前台与后台数据交互-后台调前台(后台调用、注册客户端脚本)

    转自:http://blog.csdn.net/wang379275614/article/details/17049721 客户端脚本一般都在前台,这里讲的是(1)在后台调用前台定义的脚本(2)在后 ...

  3. 一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  4. 二、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)

    2.收信息来到表单提交时URL所指向的servlet文件,获取传递过来的参数值

  5. --@angularJS--自定义服务与后台数据交互小实例

    1.myService.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title& ...

  6. --@angularJS--$http服务与后台数据交互

    1.httpBasic.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title& ...

  7. MUI框架-09-MUI 与后台数据交互

    MUI框架-09-MUI 与后台数据交互 本篇介绍使用 art-template 和原生 MUI 的数据交互 mui.ajax 来实现 我们大家都知道,想要数据交互就要有数据,每次当我们发送请求,我们 ...

  8. js前端对后台数据的获取,如果是汉字则需要添上引号

    js前端对后台数据的获取,如果是汉字则需要添上引号

  9. AntDesign(React)学习-10 Dva 与后台数据交互

    明天正式在线办公没时间学习了,今天晚上再更新一篇, 代码提交一次:https://github.com/zhaogaojian/jgdemo 1.src下创建services目录 创建文件userSr ...

随机推荐

  1. yui--datatable 更新table数据

    使用render可以重新渲染datatable,之前添加的样式等信息也想相应会初始化,另外行定位等也会失效 使用updateRows方法不会删除样式等信息 更新datasource中_oData数据 ...

  2. delphi调用java编写的webservice

    delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{    private stati ...

  3. pdf打印乱码问题

    问题: 使用Adobe Reader将一份pdf文件通过我的虚拟打印机输出后(输出的是中间文件,等同于EMF文件),查看的时候发现有时候是乱码.最简单的必现步骤: 1.使用Adobe Reader打开 ...

  4. selenium webdriver python 元素操作

    常用操作 click 点击某个元素 driver.find_element_by_id(“su”).click()   clear driver.find_element_by_id(“kw”).cl ...

  5. 比较了一下基于PhoneGAP/JQ Mobile 等基于HTML5的Phone 开发框架

    比较了一下基于PhoneGAP/JQ Mobile 等基于HTML5的Phone 开发框架,如果做APP客户端的化,想达到Native UI的效果,都是胡扯的,根本不可能. PhoneGAP 如果想达 ...

  6. Thrift初探:简单实现C#通讯服务程序

    Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,Java,Python和PHP和Ruby结合.thrift允许你定义一个 ...

  7. UITouch附加

    框架 /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKNode.h 概览 重要提示:这是一个初步的 ...

  8. php开启ssl支持

    1.首先在php的安装文件下找到三个文件 并copy到系统目标下的 system32文件夹下: ssleay32.dll.libeay32.dll,php_openssl.dll. 2.打开php.i ...

  9. 关于PHP的curl开启问题 (转)

    今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...

  10. HDU 1166 敌兵布阵(线段树)

    题目地址:pid=1166">HDU 1166 听说胡浩版的线段树挺有名的. 于是就拜訪了一下他的博客.详情戳这里.于是就全然仿照着胡浩大牛的风格写的代码. 至于原理.鹏鹏学长已经讲的 ...