asp.net 用户控件中的 Javascript 变量 - 覆盖同一插入的用户控件中的变量
Javascript variables in asp.net usercontrols - overwriting variables in same inserted usercontrol
我在 Default.aspx 中插入了四个相同的用户控件。我想将数据写入 HiddenField 并使用 javascript 将这些数据写入 Label1。
该方法仅适用于上次加载的用户控件 - HiddenFieldLoader3。
为什么该方法在所有用户控件中都不起作用?如何修复我的代码?
默认.aspx
<%@ Register Src="~/HiddenFieldLoader.ascx" TagPrefix="uc1" TagName="HiddenFieldLoader" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Default.aspx</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="HiddenFieldLoader.js"></script>
</head>
<body>
<form id="form1" runat="server">
<uc1:HiddenFieldLoader runat="server" ID="HiddenFieldLoader" />
<uc1:HiddenFieldLoader runat="server" ID="HiddenFieldLoader1" />
<uc1:HiddenFieldLoader runat="server" ID="HiddenFieldLoader2" />
<uc1:HiddenFieldLoader runat="server" ID="HiddenFieldLoader3" />
</form>
</body>
</html>
UserControl: HiddenFieldLoader.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HiddenFieldLoader.ascx.cs" Inherits="NewControls.HiddenFieldLoader" %>
<script type="text/javascript">
HFLoader.declareVariables("<%=Button1.ClientID %>", "<%=HiddenField1.ClientID %>", "<%=Label1.ClientID %>");
</script>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:HiddenField ID="HiddenField1" runat="server" />
<input type="button" ID="Button1" value="Save" runat="server" />
<input type="button" ID="Button2" onclick="HFLoader.showEvent();" value="Show" runat="server" />
Javascript 文件:HiddenFieldLoader.js
HFLoader = {
button: null,
hiddenField: null,
label: null,
declareVariables: function (btn, hf, label) {
HFLoader.button = btn;
HFLoader.hiddenField = hf;
HFLoader.label = label;
},
///////SHOW EVENT
showEvent: function () {
$("#" + HFLoader.label).html($("#" + HFLoader.hiddenField).val());
},
//////!SHOW EVENT
saveHiddenField: function (data) {
$("#" + HFLoader.hiddenField).val(data);
},
buttons: function () {
$("#" + HFLoader.button).click(function () {
var datatest = "Data from button ID: " + $(this).attr("id");
HFLoader.saveHiddenField(datatest);
$("#" + HFLoader.label).html($("#" + HFLoader.hiddenField).val());
return false;
});
},
init: function () {
$(function () {
HFLoader.buttons();
});
}
};
HFLoader.init();
它不起作用,因为您使用的是单个实例变量 HFLoader
,而不是实例。
因此,修复它的一种方法是将HFLoader
包装在更紧密的(函数、本地作用域)中,以便对象按方法调用限定作用域。 在下面的示例中,我将 HFLoader
变量包装在 creator 函数中。 然后,对HFLoaderCreator
的每次调用将生成HFLoader
对象的不同版本(实例)。 我选择这样做而不是创建一个真正的JS类的原因是因为它需要最少的代码更改来演示如何完成它。
编辑。 假设您想在以后召回 HFLoader 以调用一些东西,例如saveHiddenField
方法。 为此,我已经做了 2 个。1)我在传入的三个元素中添加了data('HFLoader')
,因此您可以使用其中任何一个来调用HFLoader
设置。 2)我添加了自定义事件,您可以触发这些事件来调用方法。 这两个选项显示了jQuery插件开发人员用来允许访问底层结构的两种不同方式。
<script type="text/javascript">
HFLoaderCreator("<%=Button1.ClientID %>", "<%=HiddenField1.ClientID %>", "<%=Label1.ClientID %>");
</script>
function HFLoaderCreator(btn, hf, label)
{
var HFLoader = {
button: null,
hiddenField: null,
label: null,
declareVariables: function (btn, hf, label) {
HFLoader.button = btn;
HFLoader.hiddenField = hf;
HFLoader.label = label;
},
saveHiddenField: function (data) {
$("#" + HFLoader.hiddenField).val(data);
},
buttons: function () {
$("#" + HFLoader.button).click(function () {
var datatest = "Data from button ID: " + $(this).attr("id");
HFLoader.saveHiddenField(datatest);
$("#" + HFLoader.label).html($("#" + HFLoader.hiddenField).val());
return false;
});
// add the data so it can be recalled at a later date
$("#" + HFLoader.button).data('HFLoader', HFLoader);
$("#" + HFLoader.hiddenField).data('HFLoader', HFLoader);
$("#" + HFLoader.label).data('HFLoader', HFLoader);
// add custom event handlers - saveHiddenField
$("#" + HFLoader.button).on('saveHiddenField', HFLoader.saveHiddenField);
$("#" + HFLoader.hiddenField).on('saveHiddenField', HFLoader.saveHiddenField);
$("#" + HFLoader.label).on('saveHiddenField', HFLoader.saveHiddenField);
// add custom event handlers - showEvent
$("#" + HFLoader.button).on('showEvent', HFLoader.showEvent);
$("#" + HFLoader.hiddenField).on('showEvent', HFLoader.showEvent);
$("#" + HFLoader.label).on('showEvent', HFLoader.showEvent);
},
init: function () {
$(function () {
HFLoader.buttons();
});
}
};
HFLoader.declareVariables(btn, hf, label);
HFLoader.init();
return HFLoader;
}
所以现在要利用这一切。 在 JS 中,如果你想根据 Button1 ID 查找 HFLoader 数据,你可以执行以下操作:
<script type="text/javascript">
var HFLoader = $('#<%=Button1.ClientID %>').data('HFLoader');
HFLoader.showEvent();
</script>
如果要使用 ButtonID1 触发自定义事件(最终将调用 showEvent 方法),可以执行以下操作:
<script type="text/javascript">
$('#<%=Button1.ClientID %>').trigger('showEvent');
</script>
如果你想内联做,就像你的第一个例子一样......
<input type="button" ID="Button2" onclick="$('#<%=Button1.ClientID %>').data('HFLoader').showEvent();" value="Show" />
尽管我强烈建议使用 JS 将事件连接到 Button2,例如:
$(function()
{
$('#<%=Button2.ClientID').click(function()
{
$('#<%=Button1.ClientID %>').data('HFLoader').showEvent();
return false;
});
});
这样它就不是内联脚本。 总的来说,HFLoader 的脚本有点被黑客入侵。 我建议看看我整理的例子,以提取有用的信息,并考虑重新思考和/或重写你做事的方式。 你的大脑正在推动你走向某种"全局"视图,或者某种称为HFLoader的自动范围变量。 但是,如果一个页面上有 5 个实例,那么您确实需要某个 HFLoader 对象的实例,而不是 HFLoader 的某个全局概念。 这就像创建一个类的新实例,而不是使用类的静态或单例实例 - 两个非常不同的概念!
我希望这有所帮助。
- 音频控件在mouseover上显示,在mouseout上淡出
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- Windows形成web浏览器控件和Javascript更改的DOM
- 如何将javascript事件从web浏览器wpf控件发送到wpf的c#代码
- 如何更改文本框控件的不透明度值
- C#WebBrowser控件-使用DOM创建和修改javascript变量,然后使用Applet读取它
- 将控件Id更改为变量
- 将重复控件绑定到会话或视图范围变量
- 如何在 ASP.NET 中将数据动态追加到 JQuery 控件变量
- 在 Web 浏览器控件中修改 Javascript 变量
- 如何防止用户修改绑定到html控件的javascript变量的值(使用任何web浏览器的调试器选项)
- 使用Node.js中的公共变量Nimble flow.parallel控件
- 如何从angular变量中拆分字符串值,并将其设置为两个html控件
- 从输入字段中获取值并存储到变量或asp标签控件中
- 我在JavaScript中有一个变量,我想把这个变量值赋给asp标签控件
- 将javascript变量放入浏览器控件winforms中
- 在ASP中分配外部JavaScript变量.使用Ajax加载的.NET用户控件
- asp.net 用户控件中的 Javascript 变量 - 覆盖同一插入的用户控件中的变量
- 我们可以在aspx页面加载控件时传递一个布尔变量吗?