1

我在 Default.aspx 中插入了四个相同的 UserControl。我想将数据写入 HiddenField 并使用 javascript 将此数据写入 Label1。

该方法仅适用于最后加载的 UserControl - 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>

用户控件: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();
4

1 回答 1

1

它不起作用,因为您使用的是单个实例变量,HFLoader而不是实例。

因此,修复它的一种方法是将您的对象包装HFLoader在更紧密的(函数,本地范围)中,以便每个方法调用都限定对象的范围。在下面的示例中,我将变量包装HFLoader在创建者函数中。然后,每次调用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 的全局概念。这就像创建一个类的新实例,而不是使用一个类的静态或单例实例——两个非常不同的概念!

我希望这有帮助。

于 2013-01-23T20:48:59.803 回答