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

JQuery .bind only works for the first control

本文关键字:第一个 控件 适用于 bind JQuery      更新时间:2023-09-26

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

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

对于这些控件中的每一个,我希望在值被更改时触发一个脚本。控件都是下拉菜单。这是我的代码隐藏当页面加载:

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

进入这个循环的第一个控件工作得很好。如果我更改下拉列表的值,脚本每次都会按预期执行。无论哪个控件先进入这个循环,每次我改变它的下拉列表值,脚本都会触发并完美执行。

但是,其他控件不触发脚本。当我改变其他下拉菜单的值时,脚本根本不会执行,它们甚至不会尝试执行脚本。

当我调试时,我可以看到每个控件实际上都进入了这个循环,并且我可以告诉它是该控件的正确ID,但无论第一个控件绑定了什么,而其他控件没有绑定。我还尝试了"on"answers"change"而不是"bind",没有区别。

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

添加这个作为答案(澄清我的评论),因为把它放在评论中会很困难。如果不能解决问题,请告诉我,我将删除它。

这个代码:

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);
}

以便在更改时运行动态脚本,而不是仅仅添加另一个更改事件侦听器。

明白了吗?

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

问题如下:

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

RegisterStartupScript有5个参数,第三个参数是key。对于我试图绑定的每个事件侦听器,我每次都将键设置为"onChange"。密钥必须是唯一的。

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

I changed

" onChange "

"onChange" + param

固定。