asp.net用户控件赢得';t在updatepanel中激发javascript

asp.net用户控件赢得';t在updatepanel中激发javascript,javascript,asp.net,user-controls,Javascript,Asp.net,User Controls,我见过类似的问题和答案,但似乎没有一个能解决这个问题 我在更新面板中有一个用户控件。在我的用户控件中,我输出javascript javascript在触发时不会触发。如果我将javascript移动到usercontrol/updatepanels之外的父页面,则会触发。这样做是没有意义的,因为我不能在另一个页面上使用这个usercontrol而不复制代码……或者复制整个javascript(不同的站点),或者在每个页面(相同的站点)中添加对.js文件的引用。它只是不太方便携带 我只想输出带有

我见过类似的问题和答案,但似乎没有一个能解决这个问题

我在更新面板中有一个用户控件。在我的用户控件中,我输出javascript

javascript在触发时不会触发。如果我将javascript移动到usercontrol/updatepanels之外的父页面,则会触发。这样做是没有意义的,因为我不能在另一个页面上使用这个usercontrol而不复制代码……或者复制整个javascript(不同的站点),或者在每个页面(相同的站点)中添加对.js文件的引用。它只是不太方便携带

我只想输出带有控件的javascript(在更新面板内)

提到updatepanel是为了确保我所做工作的准确性。即使我将usercontrol放在updatepanels之外,它也不起作用

保持简单(这对我不起作用):

用户控制:

<%@ 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
属性时,它的解析就完成了

有以下可用的解决方法:

  • 将javascript移到外部文件中
  • 将脚本移到UpdatePanel之外
  • 使用或替代函数在代码隐藏中注册脚本

  • 处理绑定到
    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>