【问题标题】:Same JavaScript for multiple instances of user control not working多个用户控件实例的相同 JavaScript 不起作用
【发布时间】:2012-03-24 12:03:32
【问题描述】:

我在我的网站中使用了一个用户控件,它执行自动完成文本框的功能。我已将 JavaScript 用于 keydown 和 onfocus 客户端事件。这是代码:

<script language="JavaScript" type="text/javascript">
function TriggeredKey(e) {
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    if (keycode == 9) {
        document.getElementById("<%=pnlSearch.ClientID %>").style.visibility = 'hidden';
        document.getElementById("<%=pnlSearch.ClientID %>").style.display = 'none';
    }
    else {
        document.getElementById("<%=hdfkey.ClientID %>").value = keycode;
    }
    _dopostback();
}


function pasteIntoInput(el) {
    var text = document.getElementById("<%=txtSearch.ClientID %>").value;
    if (typeof text != "undefined" && text != "") {
        el.focus();
        el.value = el.value;
        if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
            var val = el.value;
            var selStart = el.selectionStart;
            el.value = val.slice(0, selStart) + val.slice(el.selectionEnd);
            el.selectionEnd = el.selectionStart = selStart + text.length;
        }
        else if (typeof document.selection != "undefined") {
            el.focus();
        }
    }
}

当我在我的 aspx 页面中使用此控件的单个实例时,它可以正常工作,但是当我在我的 aspx 页面中使用多个实例时,所有控件的 JavaScript 都会被我页面中控件的最后一个实例覆盖并且没有其他控件起作用。

【问题讨论】:

    标签: javascript asp.net user-controls


    【解决方案1】:

    这是我过去处理此类问题的方式...

    像这样的块放在控件 ascx 中引用的外部 js 文件中。

        function UserControl() {
        }
    
        UserControl.prototype = {       
            DoStuff : function() {
                    var x = this.clientID; 
                    window.alert(this.pnlSearchClientID);
                },
            TriggeredKey : function(e) {
                    var keycode;
                    if (window.event) keycode = window.event.keyCode;
                    if (keycode == 9) {
                        document.getElementById(this.pnlSearchClientID).style.visibility = 'hidden';
                        document.getElementById(this.pnlSearchClientID).style.display = 'none';
                    }
                    _dopostback();
                },
            pasteIntoInput : function() {
                var text = document.getElementById(this.txtSearchClientID).value;
            }
        };
    

    这样的块在 ascx 文件中:

    <script type="text/javascript">
        function UserControl<%=this.ClientID%>() {
            this.pnlSearchClientID = <%=pnlSearch.ClientID%>;
            this.txtSearchClientID = <%=txtSearch.ClientID%>;
        }
        UserControl<%=this.ClientID%> = UserControl.prototype;
    
    </script>
    

    然后在包含用户控件的页面中:

    <script type="text/javascript">
        var inst1 = new UserControl<%=instance.ClientID %>();  
        inst1.DoStuff();
    </script>
    

    这个想法是你有一个具有你需要的功能的基类,在用户控件的所有实例之间共享。然后是用户控件的每个实例的派生类,新的构造函数为所有特定于实例的日期(即组成用户控件的控件的 ID)设置属性。基类引用这些属性。派生类使用用户控件的 ClientID 命名,使其在页面上是唯一的。

    我无法访问 asp.net ATM,所以这里可能有错误...

    【讨论】:

    • 感谢您的 rply.. 但请告诉我何时必须调用父页面 javascript 代码
    • 您可以将页面 javascript 中所需的任何内容的引用传递给用户控件 javascript 对象 - 在用户控件 javascript 对象中设置属性,将某些内容传递给构造函数,将参数传递给定义的方法在用户控件 javascript 对象上。如果您为父页面定义了类似类型的 javascript 对象,则可以在实例化该对象时将该对象传递给用户控件...很多选项。
    • 我尝试按照上述方法,但没有奏效。有人可以帮助我吗:stackoverflow.com/questions/42156131/…
    【解决方案2】:

    首先我会在一个地方定义你的 javascript 函数,可能是父页面,甚至是全局引用的文件。这样,当您在单个页面上使用用户控件的多个实例时,您就不会一遍又一遍地呈现相同的功能。

    然后,我建议不要将 pnlSearch 和 txtSearch 控件的客户端 ID 嵌入到 JavaScript 函数中,而是在调用它们时将它们传递到函数中。

    您在呈现的用户控件的最后一个实例上设置 JavaScript 函数的方式将是每次都会调用的函数,这将导致先前呈现的用户控件实例中的函数被忽略.

    【讨论】:

    • 感谢您的 rply... 我的 javascript 现在可以正常工作了。但有一些问题。 1)我将 pnlsearch id 传递给函数,但根据我在选项卡上的代码,面板应该被隐藏,但它现在不起作用。 2) 我在我的用户控件中使用了 AJAX PopupControl。在多个实例中,弹出控件之间也存在冲突。请告诉我如何解决这些问题。非常感谢您的帮助
    • 嗨,raina,我很高兴,您能否发布您更新的代码以及包含 AJAX PopupControl 的用户控件示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多