JQuery .bind仅适用于第一个控件

时间:2015-05-27 19:42:15

标签: javascript c# jquery asp.net user-interface

我在这里读过类似的标题问题,但他们遇到的行为并不完全相同。请不要链接到类似的问题,如果您仔细阅读,这个问题会略有不同。

我有动态创建的这些控件。它们没有硬编码ID。

对于这些控件中的每一个,我想要在更改值时触发脚本。 控件都是下拉列表。这是我加载页面时的代码隐藏:

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}

进入此循环的第一个控件完美运行。如果我更改下拉列表的值,则脚本每次都按预期执行。对于先进入此循环的控件,每次更改其下拉值时,脚本都会触发并完美执行。

但是,其他控件不会触发脚本。当我更改其他下拉列表的值时,脚本根本不会执行,甚至不会尝试执行脚本。

当我调试时,我可以看到每个控件实际上都进入了这个循环,我可以告诉它它是控件的正确ID,但无论第一个控件绑定什么,其他控件都没有。 我也试过“开”和“改变”而不是“绑定”,没有区别。

我确信人们会希望看到脚本本身,但问题可以与C#代码隔离开来。 JS控制台中没有任何内容,开发人员工具中页面上的标记没有任何值得一看,只是一堆硬编码的敏感无关信息,我显然无法分享。这个问题可以与C#代码隔离开来,因为即使我用非常简单的东西(例如简单的警报)替换dynamicScript,它也只适用于第一个控件。

2 个答案:

答案 0 :(得分:1)

添加此作为答案(澄清我的评论),因为将其置于评论中会很困难。如果它没有解决它,请告诉我,我将删除它。

此代码:

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}

这部分是添加一个事件监听器(监听改变并做一些事情),而不是一个函数调用(做一些改变):

"$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});"

应该是

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange", dynamicScript, true);
}

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "function(){"+dynamicScript+"}", true);
}

这样它就可以在onchange上运行你的动态脚本而不只是添加另一个更改事件监听器。

这有意义吗?

旁注为了将来参考,编写像$('#MainContent_JenkinsField_[redacted]')这样的代码可能会让您的问题进一步混淆,因为[]可以成为jQuery的一部分选择。如果从字面上理解,该选择器将查找ID为MainContent_JenkinsField_且具有名为redacted的属性的元素。我希望括号只是为了显示你删除了param的位置,真正的选择器看起来像这样:$('#MainContent_JenkinsField_yourParam')

答案 1 :(得分:0)

以下是问题所在:

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange", "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}

RegisterStartupScript需要5个参数,第3个参数是键。对于我试图绑定的每个事件监听器,我给出了关键字" onChange"每次。关键需要是独一无二的。

foreach (string param in hasDependencies.Keys)
{
    ScriptManager.RegisterStartupScript(this, GetType(), "onChange" + param, "$('#MainContent_JenkinsField_" + param + "').on('change', function(){" + dynamicScript + "});", true);
}

我改变了

  

"的onChange"

  

"的onChange" + param

固定。