惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - shuang

heart or house? Dos for -- by 随风 - shuang C--Pointer Raid -----asp web 报表 - shuang ----[创业指南]给海归技术创业兄弟的九个忠告 --设计模式--Hibernate about avast job desc 把INT转换成2进制等 private/实现有多个相同方法的接口 使用接口改变已经装箱的值类型的字段 struct也有方法成员 virtual 集成资源文件 const -readonly- static readonly 脚本---用函数模拟类 ClientScriptManager html______1
csm2
shuang · 2007-12-18 · via 博客园 - shuang

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write(
"<script>alert('Hello world!');</script>");
}

但是这段代码也许会让一个支持XHTML的手机浏览器死机,因这个页面最终呈现这样的客户端代码:
<script>alert('Hello world!');</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
......
由于这句代码,整个文档已经不是一个合法的xHTML文档,因为XML要求<!DOCTYPE>语句应该在文档的最前面。
回顾页面生命周期,页面的内容在执行Render()方法时呈现到客户端,它是页面生命周期中最后阶段执行的方法,远远晚于PageLoad和各个控件的回传事件,所以我们在PageLoad或ButtonClick这些事件处理程序中用Response.Write()方法输入的内容将出现在客户端代码的最前端,最终破坏整个页面结构。
***********************************
要往页面中呈现脚本,我们可以选择ClientScriptManager.RegisterClientScriptBlock()方法或ClientScriptManager.RegisterStartupScript()方法。这两个方法的参数和功能都差不多,不同之处在于它们将代码呈现在页面的不同的地方,前一个方法将客户端代码呈现在页面表单的最前面,也就是这些代码位于所有页面元素之前,这使得脚本最先被浏览器解析后一个方法将客户端代码呈现在页面表单的最末端,页面解析这些脚本时,页面上的各种元素已经完成解析,这就使得这些脚本可以马上操作页面上的元素
*************************************
所以我们常用前一个方法呈现一些不会马上执行的代码,比如声明某个按钮的Click事件处理程序,而用后一个方法呈现页面加载完成后马上执行的代码,比如定义某个变量的初始值,对页面元素进行某种操作

 if (!Page.ClientScript.IsClientScriptBlockRegistered("HelloWorldDeclaration"))
{
 Page.ClientScript.RegisterClientScriptBlock(
typeof(string),
                    
"HelloWorldDeclaration",
                    
"function sayHello(){alert('Hello world!');}"true);
}


 
if (!Page.ClientScript.IsStartupScriptRegistered("HelloWorldExecution"))
{
 Page.ClientScript.RegisterStartupScript(
typeof(string),
                    
"HelloWorldExecution""sayHello();"true);
}

在这段代码中,我们分别使用RegisterClientScriptBlock()方法声明sayHello()方法,用RegisterStartupScript()方法呈现执行sayHello()方法的代码,这两个方法的最后一个参数设为true,使得这两个方法将自动生成<script>标签对
在使用这两个方法的过程中,还使用配套的IsXXXRegistered()方法对代码是否已经注册过进行判断。在这个页面中使用这些判断并没有太大的意义,但在控件中却很有必要性,因为你不知道用户会放多少个同样的控件到页面中,如果每个控件实例都呈现一遍相同的脚本,则会在页面中产生大量冗余代码
****************************************