添加一个包含 javascript 的用户控件会破坏 jquery-ui

Posted

技术标签:

【中文标题】添加一个包含 javascript 的用户控件会破坏 jquery-ui【英文标题】:Adding a user control containing javascript inside it breaks jquery-ui 【发布时间】:2015-04-30 11:09:12 【问题描述】:

我有一个用户控件定义为:

<div>
    <asp:TextBox ID="txtBox" runat="server"></asp:TextBox>
    <asp:CustomValidator ID="validator" runat="server" ControlToValidate="txtBox"></asp:CustomValidator>
</div>
<script type="text/javascript">
    $(document).ready(function () 
        $('#<%= txtBox.ClientID %>').blur(function (event) 
            $('#<%= txtBox.ClientID %>').removeClass('errorTextBoxServer');
            testBox($('#<%= txtBox.ClientID %>'), <%= RegularExpression %>);
        );

        testBox($('#<%= txtBox.ClientID %>'), <%= RegularExpression %>);
    );

    function <%= txtBox.ClientID %>_validateBox(source, args)
    
        $('#<%= txtBox.ClientID %>').removeClass('errorTextBoxServer');
        args.IsValid = testBox($('#<%= txtBox.ClientID %>'), <%= RegularExpression %>);
    
</script>

testBox 定义为:

function testBox(thisBox, RegularExpression) 
    if ($(thisBox).val() != "") 
        var regex = new RegExp(RegularExpression);
        var value = $(thisBox).val();
        if (!regex.test(value)) 
            //event.preventDefault();
            $(thisBox).addClass('errorTextBox');
            return false;
        
        else 
            $(thisBox).removeClass('errorTextBox');
            return true;
        
    
    else 
        $(thisBox).removeClass('errorTextBox');
        return true;
    

并且在网页中放置如下:

<asp:TextBox ID="txtD1DOB" runat="server" readonly="true"></asp:TextBox>
<wpm:ValidatedTextBox id="txtUpdatedBalance" runat="server" RegularExpression="/^\d1,3(,?\d3)*(\.\d2,4)?$/" />

使用如下js:

$(document).ready(function () 
    var $j = jQuery.noConflict();
    $j("input[id*='txtD1DOB']").datepicker(
        changeMonth: true,
        changeYear: true,
        dateFormat: "dd/mm/yy",
    );
);

当我运行应用程序时,js 会抛出错误:

对象不支持属性或方法'datepicker'

如果我删除用户控件&lt;wpm:ValidatedTextBox id="txtUpdatedBalance" runat="server" RegularExpression="/^\d1,3(,?\d3)*(\.\d2,4)?$/" /&gt;,那么datepicker 将按预期工作。

我检查了是否有其他版本的 jquery-ui 加载,但找不到任何东西,似乎找不到导致问题的原因。有什么想法吗?

编辑:我尝试将用户控件更改为简单:

<asp:TextBox ID="txtUpdatedBalance" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="txtUpdatedBalance_RegularExpressionValidator" runat="server" ErrorMessage="Invalid value" ControlToValidate="txtUpdatedBalance" ValidationExpression="/^\d1,3(,?\d3)*(\.\d2,4)?$/"></asp:RegularExpressionValidator>

但同样的事情也会发生。删除RegularExpressionValidator 可以让一切正常工作。

编辑 2:作为对 cme​​ts 中 Frebin Francis 的回应,整个头部是:

<head runat="server">
    <meta charset="utf-8" />
    <title><%: Page.Title %> - My ASP.NET Application</title>
    <asp:PlaceHolder runat="server">     
          <%: Scripts.Render("~/bundles/modernizr") %>
    </asp:PlaceHolder>  
    <webopt:BundleReference runat="server" Path="~/Content/css" /> 
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/smoothness/jquery-ui.css" />
     <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>
    <script src="Scripts/wpm_portal.js"></script>
    <meta name="viewport" content="width=device-width" />
    <asp:ContentPlaceHolder runat="server" ID="HeadContent" />
</head>

它还有一个ScriptManager,定义为:

<asp:ScriptManager runat="server">
    <Scripts>
        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
        <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
        <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
        <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
        <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
        <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
        <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
        <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
        <asp:ScriptReference Name="WebFormsBundle" />
    </Scripts>
</asp:ScriptManager>

【问题讨论】:

你把你的 jquery ui 库放在哪里了?您需要引用 jquery 库以及 jquery ui 库供您控制。 为什么你将 asp.net 文本框 ID 称为 "txtD1DOB" 或像这样 $('#') ?这就是它在 html 上呈现的方式吗? 是否有任何控制台错误?你有没有在用户控制页面上添加任何脚本? 我想知道这是否与您在第二个 onready 函数中使用 noconflict 有关。也许尝试像这样为两者设置onready? ***.com/a/7882412/4597917 @Frebin - 输入错误,实际上是input[id*='txtD1DOB']。除了“对象不支持属性或方法'datepicker'”之外没有控制台错误,并且没有在用户控件中添加额外的脚本。用户控件基本上如您在上面看到的那样。 【参考方案1】:

ASP.NET 4.5 引入了unobtrusive JavaScript for client-side validation。启用此功能时(默认情况下),像 CustomValidator 这样的验证控件会自动包含项目脚本目录中的 jQuery 副本。此副本与您在 &lt;head&gt; 中引用的 jQuery 版本冲突。

解决问题的最简单方法是关闭不显眼的验证,您可以通过将以下设置添加到 Web.config 来做到这一点:

<appSettings>
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

如果您想使用不显眼的验证,请按照以下步骤操作:

    使用 NuGet 包管理器,将 AspNet.ScriptManager.jQuery 升级到 2.1.3 版并安装 AspNet.ScriptManager.jQuery.UI.Combined 1.11.3 版。 从 Google CDN 中删除包含 jquery.min.js 和 jquery-ui.min.js 的 &lt;script&gt; 标签。 将"jquery""jquery.ui.combined"&lt;asp:ScriptReference&gt; 标签添加到&lt;asp:ScriptManager&gt; 控件。

【讨论】:

【参考方案2】:

RegularExpression 不是 .NET 中的命名空间,请将变量名更改为 rX 或其他名称。

为了兼容性:

尝试在 document.ready 之外使用 noConflict 对象

如:

var $j = jQuery.noConflict();
$j(document).ready(function () 

    $j("input[id*='txtD1DOB']").datepicker(
        changeMonth: true,
        changeYear: true,
        dateFormat: "dd/mm/yy",
    );
);

对所有与 jQuery 相关的调用执行相同的操作。

【讨论】:

以上是关于添加一个包含 javascript 的用户控件会破坏 jquery-ui的主要内容,如果未能解决你的问题,请参考以下文章

通过 javascript 添加 HTML 控件

Javascript 在 ASCX 中不起作用 – ASP NET 用户控件

UpdatePanel 中的 JavaScript 代码

如何判断 JavaScript 文件是不是已包含在 ASP.NET 页面中?

深入理解JavaScript系列(40):设计模式之组合模式

将 ErrorTemplate 添加到 WPF 用户控件会禁用 TextBox 输入