【问题标题】:Jquery ddl Change event Not firingJquery ddl更改事件未触发
【发布时间】:2023-03-16 19:16:01
【问题描述】:

我正在使用 .NET 4 和 JQuery 来显示/隐藏 Div,具体取决于从 DDL 中选择的内容。当我手动单击下拉菜单时,Jquery 会按预期触发并显示/隐藏字段。但是当我以编程方式更改 DDL 的 selectedValue 时,Jquery 根本不会触发。我有一个带有两个选项的单个 ddl,单个和重复,我显示选定的 div 并保持另一个隐藏。

$(document).ready(function () {
    $("#MainContent_ddlScheduleType").change(function () {
        $('#Single').hide();
        $('#Recurring').hide();
        var newSelection = "#" + this.value;
        $(newSelection).fadeIn('slow');
    });
});

在实际页面内部有两个下拉字段,第一个是当前在数据库表中的所有作业的列表。这些作业要么运行一次,要么运行多次(单次、重复)。用户从第一个下拉列表中选择作业的名称。存储过程从数据库中提取该作业的信息并将其存储在客户端变量中。然后我比较那个客户端变量来决定我是否应该改变下拉菜单。这是完成大部分工作的事件处理程序。所以再次总结一下,当您从第一个下拉列表中选择作业时,第二个下拉列表应该会更改以反映它是重复的还是单个的(这会成功发生!)但是 Jquery 实际上并没有显示相应的 Single / Recurring Div它应该显示。

        protected void ddlJobList_SelectedIndexChanged(object sender, EventArgs e)
    {
        string  Frequency = null;
        SqlParameter sqlParameter = new SqlParameter("@JobName", ddlJobList.SelectedItem.Text);
        DataTable dt = SqlHelper.GetDataTable("zzGetJobInformation", CommandType.StoredProcedure, sqlParameter);

        if (!(dt.Rows[0]["Frequency"] is DBNull))
            Frequency = dt.Rows[0]["Frequency"].ToString();

        if (Frequency == null)
            ddlScheduleType.SelectedValue = "Single";
        else
            ddlScheduleType.SelectedValue = "Recurring";
    }

这不会导致 Jquery 触发的任何原因?

我看过这里: jQuery drop down list change event not fire

虽然我没有使用 MVC,但我以前使用过 MVC,因此我可以关联看起来与我非常相似的代码。不幸的是,“解决方案”的链接不再有效,他们的答案也不是很具描述性。我可以肯定地说,firebug 中没有报告控制台/javascript 错误。

【问题讨论】:

  • 我怀疑 .net 在这方面发挥了作用。服务器技术对客户端脚本没有影响。
  • @Jason Meckley 是的,但我通过从数据库中提取来决定 ddlScheduleType.SelectedValue 的值,然后如果它是某个值,我使用 C# 和 asp ddl 将 DDL 设置为 Single .

标签: c# javascript jquery .net .net-4.0


【解决方案1】:

好的,这解释得更好一些。混淆来自混合服务器和客户端代码。我建议使用其中一个来管理下拉列表和影响,而不是同时使用两者。

同时使用这两种方法意味着您必须处理回发、网络表单事件并维护客户端 (jquery) 和服务器 (.net) 上的状态,这很麻烦。

我会使用网络表单来管理 UI 的状态,或者使用带有页面方法、asmx 或其他类型的 asp.net 处理程序的 jquery 和 ajax 请求来管理 UI 的状态。

【讨论】:

  • 这样的陈述让我觉得我的问题问错了,或者我错过了一些编程基础知识...... ddlScheduleType.SelectedValue = "Single";是 .net 4,当下拉列表更改时发生在 C# 函数事件处理程序中。它不能在 JavaScript 函数内部调用。
  • 那就是问题所在。服务器和客户端代码不直接相互影响。两者之间存在完整的请求/响应。更改发生在客户端或服务器上,而不是同时发生。好吧,他们可以,但是您需要连接 ajax 调用并处理客户端和服务器上的请求和响应。但在这种情况下,更改服务器上的选定值与 jquery 更改处理程序无关。
  • 我想我在解释发生了什么方面又做得很差。服务器端信息填充在运行时完成一次,然后每次顶部下拉列表更改。让我编辑我的主要帖子。一分钟。
  • 谢谢。这也是我得出的结论。当我使用 .net 更改 DDL 的值时,似乎没有触发 jquery change()。多么不幸。
  • 并不不幸。这是 Web 开发的本质。它要么发生在客户端上,要么发生在服务器上,而不是两者都发生。使用 ajax 时,我发现最好只从服务器请求数据,然后允许 jquery 操作 dom。让服务器返回布局的 sn-ps 模糊了谁负责什么之间的区别。
【解决方案2】:

这是竞争条件吗?您在什么时候以编程方式设置所选值? $(document).ready 等到很晚(相对于生命周期)才执行,以便它知道您尝试在 $(document).ready 中访问的所有内容都已呈现...

如果您在 document.ready 中任意设置所选值,您可以在创建事件之前调用它。

【讨论】:

  • 不,不应该是竞争条件。一次只有一件事可以访问 ddl.ScheduleType.Selected 值。此外,Yes Document.ready() 确实最后触发,但 $("#MainContent_ddlScheduleType").change(function ()) 应该在每次更改下拉列表时触发,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多