Xai*_*oft 136 .net javascript c# asp.net
是唯一的区别RegisterStartupScript
和RegisterClientScriptBlock
是的RegisterStartupScript提出的JavaScript结束前</form>
的页面的标签,并把的RegisterClientScriptBlock它开始之后<form>
的页面的标签?
另外,你什么时候选择一个?我写了一个快速的示例页面,我遇到了一个问题,我不确定它发生原因的确切原因.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblDisplayDate" runat="server"
Text="Label" /><br />
<asp:Button ID="btnPostback" runat="server"
Text="Register Startup Script"
onclick="btnPostback_Click" /><br />
<asp:Button ID="btnPostBack2" runat="server"
Text="Register"
onclick="btnPostBack2_Click" />
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
protected void Page_Load(object sender, EventArgs e)
{
lblDisplayDate.Text = DateTime.Now.ToString("T");
}
protected void btnPostback_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@"<script language='javascript'>");
sb.Append(@"var lbl = document.getElementById('lblDisplayDate');");
sb.Append(@"lbl.style.color='red';");
sb.Append(@"</script>");
if(!ClientScript.IsStartupScriptRegistered("JSScript"))
{
ClientScript.RegisterStartupScript(this.GetType(),"JSScript",
sb.ToString());
}
}
protected void btnPostBack2_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@"<script language='javascript'>");
sb.Append(@"var lbl = document.getElementById('lblDisplayDate');");
sb.Append(@"lbl.style.color='red';");
sb.Append(@"</script>");
if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock"))
{
ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock",
sb.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我单击btnPostBack
按钮时,它会进行回发并将标签更改为红色,但是当我单击btnPostBack2
它时,它会进行回发,但标签颜色不会变为红色.为什么是这样?是因为标签没有初始化?
我还读到,如果你正在使用UpdatePanel
,你需要使用ScriptManager.RegisterStartupScript
,但如果我有MasterPage
,我会使用ScriptManagerProxy
吗?
Cer*_*rus 157
这是一个旧的讨论主题,其中列出了主要差异以及应该使用这些方法的条件.我想你可能会觉得通过讨论很有用.
要解释与您发布的示例相关的差异:
一个.当您使用时RegisterStartupScript
,它将在页面中的所有元素之后(在表单的结束标记之前)呈现您的脚本.这使脚本可以调用或引用页面元素,而不会在页面的DOM中找不到它们.
以下是调用RegisterStartupScript
方法时页面的呈现源:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1"><title></title></head>
<body>
<form name="form1" method="post" action="StartupScript.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" />
</div>
<div> <span id="lblDisplayDate">Label</span>
<br />
<input type="submit" name="btnPostback" value="Register Startup Script" id="btnPostback" />
<br />
<input type="submit" name="btnPostBack2" value="Register" id="btnPostBack2" />
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="someViewstategibberish" />
</div>
<!-- Note this part -->
<script language='javascript'>
var lbl = document.getElementById('lblDisplayDate');
lbl.style.color = 'red';
</script>
</form>
<!-- Note this part -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
湾 使用时RegisterClientScriptBlock
,脚本将在Viewstate标记之后,但在任何页面元素之前呈现.由于这是一个直接脚本(不是可以调用的函数,它将立即由浏览器执行.但是浏览器在此阶段没有在Page的DOM中找到标签,因此您应该收到"未找到对象"错误.
以下是调用RegisterClientScriptBlock
方法时页面的呈现源:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1"><title></title></head>
<body>
<form name="form1" method="post" action="StartupScript.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" />
</div>
<script language='javascript'>
var lbl = document.getElementById('lblDisplayDate');
// Error is thrown in the next line because lbl is null.
lbl.style.color = 'green';
Run Code Online (Sandbox Code Playgroud)
因此,总而言之,如果要渲染函数定义,则应调用后一种方法.然后,您可以使用前一种方法(或添加客户端属性)呈现对该函数的调用.
评论后编辑:
例如,以下函数可以工作:
protected void btnPostBack2_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script language='javascript'>function ChangeColor() {");
sb.Append("var lbl = document.getElementById('lblDisplayDate');");
sb.Append("lbl.style.color='green';");
sb.Append("}</script>");
//Render the function definition.
if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock"))
{
ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString());
}
//Render the function invocation.
string funcCall = "<script language='javascript'>ChangeColor();</script>";
if (!ClientScript.IsStartupScriptRegistered("JSScript"))
{
ClientScript.RegisterStartupScript(this.GetType(), "JSScript", funcCall);
}
}
Run Code Online (Sandbox Code Playgroud)
这是ASP.NET社区中最简单的示例,这使我对概念有了清晰的了解。
这有什么区别?
对于此示例,这是一种将页面加载到浏览器中时将焦点放在页面上的文本框上的RegisterStartupScript
方法-使用Visual Basic,使用方法:
Page.ClientScript.RegisterStartupScript(Me.GetType(), "Testing", _
"document.forms[0]['TextBox1'].focus();", True)
Run Code Online (Sandbox Code Playgroud)
之所以行之有效,是因为页面上的文本框是在浏览器进入页面底部并获取少量JavaScript时生成并放置在页面上的。
但是,如果改为这样编写(使用RegisterClientScriptBlock
方法):
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Testing", _
"document.forms[0]['TextBox1'].focus();", True)
Run Code Online (Sandbox Code Playgroud)
焦点将不会到达文本框控件,并且页面上将生成JavaScript错误
这样做的原因是,浏览器将在页面上的文本框之前遇到JavaScript。因此,JavaScript将无法找到TextBox1。
归档时间: |
|
查看次数: |
174865 次 |
最近记录: |