asp.net用户控件赢得';t在updatepanel中激发javascript
我见过类似的问题和答案,但似乎没有一个能解决这个问题 我在更新面板中有一个用户控件。在我的用户控件中,我输出javascript javascript在触发时不会触发。如果我将javascript移动到usercontrol/updatepanels之外的父页面,则会触发。这样做是没有意义的,因为我不能在另一个页面上使用这个usercontrol而不复制代码……或者复制整个javascript(不同的站点),或者在每个页面(相同的站点)中添加对.js文件的引用。它只是不太方便携带 我只想输出带有控件的javascript(在更新面板内) 提到updatepanel是为了确保我所做工作的准确性。即使我将usercontrol放在updatepanels之外,它也不起作用 保持简单(这对我不起作用): 用户控制:asp.net用户控件赢得';t在updatepanel中激发javascript,javascript,asp.net,user-controls,Javascript,Asp.net,User Controls,我见过类似的问题和答案,但似乎没有一个能解决这个问题 我在更新面板中有一个用户控件。在我的用户控件中,我输出javascript javascript在触发时不会触发。如果我将javascript移动到usercontrol/updatepanels之外的父页面,则会触发。这样做是没有意义的,因为我不能在另一个页面上使用这个usercontrol而不复制代码……或者复制整个javascript(不同的站点),或者在每个页面(相同的站点)中添加对.js文件的引用。它只是不太方便携带 我只想输出带有
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="_location.ascx.cs" Inherits="_location" %>
<script type="text/javascript">
function test() {
alert('Hello World!');
}
</script>
<a href="javascript:void(0);" onclick="javascript:test();">
Find For Me
</a>
如上所述,将函数移动到父页面也可以
这就好像浏览器忽略了用户控件的脚本输出一样
有什么想法吗?当你有一个
UpdatePanel
并且UpdatePanel
更新了它的内容时,它会将它的内容视为简单的文本/html(不是代码),它没有任何解析器可用于运行脚本并使其可用于页面
那么这个内容,
<script type="text/javascript">
function test() { alert('Hello World!'); }
</script>
<a href="javascript:void(0);" onclick="javascript:test();">
Find For Me
</a>
函数测试(){alert('Hello World!');}
更新面板的客户端代码运行并更新页面内容后,脚本部分不会被解析——页面的简单文本/html
然而,这一部分却在运行
<a href="javascript:void(0);" onclick="alert('Hello World!');">Find For Me</a>
因为当您单击onclick
属性时,它的解析就完成了
有以下可用的解决方法:
处理绑定到
UpdatePanel
中DOM元素的javscript代码的首选方法是订阅的endRequest
事件并在此处执行代码。例如,您希望在此处设置单击事件处理程序
// that is standard way for asp.net to execute JS on page load
// pretty much the same as $(function(){ ...}) with jquery
function pageLoad() {
// find PRM instance and subscribe to endRequest
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
}
function endRequest() {
// set all handlers to DOM elements that are within UpdatePanel
$('<%= myButton.ClientID %>').on('click', test)
}
function test(e) {
alert('Hi')
}
并在更新面板周围放置名为container
的类的div
。在这种情况下,div.container
永远不会从DOM中删除,因此在部分回发之后,它上的所有事件处理程序都将保持不变
没有jquery且仅使用asp.net ajax的相同代码如下所示:
function pageLoad() {
Sys.UI.DomEvent.addHandler($("myContainer"), "click", delegatedTest);
}
function delegatedTest(e) {
// since asp.net ajax does not support event delegation
// you need to check target of the event to be the right button
if (e.target.id == "myButton") test(e)
}
function test(e) {
alert("HI")
}
感谢亚里士多德让我走上正确的道路。。。尽管他的解决方案可行,但它没有回答从usercontrol内部输出javascript的问题,而是建议将其移到外部。如前所述,这不是期望的结果,因为它没有被保存在控件中以便于移植 以下是我的解决方案,可以实现这一点: CS文件:
String脚本=”“;
脚本+=“函数测试(){”;
脚本+=“警报('Hello World!');”;
脚本+=“”;
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),“locationScript”,script);
如果脚本较长,可以使用stringbuilder,但这两种方式都可以
这将代码完全保留在usercontrol中,它从标记的onclick事件开始工作。除了Adam Wood发布的解决方案之外,我应该说,在使用update panel时,您必须使用ScriptManager来注册脚本,至少在.net 4.0中是这样,否则它将无法工作 因此,您可以将以下内容放在usercontrol的PageLoad事件上:
string script = @" alert('this is a test');
alert('it worked')";
ScriptManager.RegisterStartupScript(Page,Page.GetType(),"scriptMelhoria",script,true);
试试这个
您可以在udpdate面板回调后找到脚本元素并对其求值
在内联脚本标记中添加一个特殊属性,以在回调请求后选择元素
<script type="text/javascript" data-tag='myscript'>
function test() {
alert('Hello World!');
}
</script>
功能测试(){
警惕(“你好,世界!”);
}
并将此脚本添加到更新面板容器aspx文件中
<script>
if (Sys !== undefined) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(endPostbackRequest);
}
function endPostbackRequest(sender, args) {
$("script[data-tag='myscript']:not([data-run])").each(
function () {
eval.apply(window, [$(this).text()]);
$(this).attr('data-run', '1');
});
}
</script>
如果(Sys!==未定义){
var prm=Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(endPostbackRequest);
}
函数endPostbackRequest(发送方,参数){
$(“脚本[data tag='myscript']:非([data run]))。每个(
函数(){
eval.apply(窗口,[$(this.text()]);
$(this.attr('data-run','1');
});
}
你的代码对我来说很好。@chamara如果你在UpdatePanel中调用并更新它,那么这段代码将不起作用。这与我在问题中陈述的工作方式没有太大区别。如果我必须将脚本放在UpdatePanel之外,那么我将被迫将其包含在父页面上……我的usercontrol位于updatepane中是的,即使不使用registerclientscriptblock,将脚本放在updatepanel之外也可以正常工作。虽然这样做,但并不理想。当然,MS已经提供了一种方法,将javascript包含在用户控件中,以实现可移植性(如果没有其他功能的话)。@AdamWood您可以在代码behi上注册脚本nd.我回答你的问题时的不同之处在于,你没有意识到更新它没有解析,也无法解析脚本-这是这里的关键点。Thx。它解释了为什么UpdatePanel中UserControl上的内联代码根本不可调用。它只是文本。搜索数小时……我认为这是解决问题的方法r问题。我正在尝试将jquery事件绑定到控件。但我收到0x800a139e-JavaScript运行时错误:语法错误,无法识别的表达式:#,由于某种原因,我无法访问脚本中的用户控件。(我这样做是因为如果我把脚本放在我的用户控件上,它驻留在更新面板中,我的脚本根本不会启动)。
String script = "<script type=\"text/javascript\">";
script += "function test() {";
script += "alert('Hello World!');";
script += "</script>";
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "locationScript", script);
string script = @" alert('this is a test');
alert('it worked')";
ScriptManager.RegisterStartupScript(Page,Page.GetType(),"scriptMelhoria",script,true);
<script type="text/javascript" data-tag='myscript'>
function test() {
alert('Hello World!');
}
</script>
<script>
if (Sys !== undefined) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(endPostbackRequest);
}
function endPostbackRequest(sender, args) {
$("script[data-tag='myscript']:not([data-run])").each(
function () {
eval.apply(window, [$(this).text()]);
$(this).attr('data-run', '1');
});
}
</script>