0

所以我在这里找到了一个很棒的解决方案来解决需要在 jQuery 中使用全局变量的问题。我到处说命名空间,最初我打算使用全局变量。

但是,我无法通过简单的单击功能上的参数发送我的命名空间变量。

我想这样做是因为我有这些变量需要保存并用于创建模态窗口以及让应用程序知道哪些动态创建的按钮控制着哪些模态。

所以下面是我的命名空间对象的示例,我首先在其中创建变量 My jQuery 命名空间对象:

$.reg = { 
    masterRole : " ", 
    role_ID : " ",
    row_Name : " ",
    ary_Check_Role : []
}; 

$(document).ready(function () {
    ...

当您浏览应用程序时,这些名称空间变量的值会在您单击此按钮时设置(从 HTML 中获取数据)在我的 roleBtnClicked 函数上设置变量

function roleBtnClicked(event){

    $.reg.masterRole  = $(this).html();            /* Get role name: Actor */
    $.reg.role_ID     = $(this).attr('role');      /* Get role-1 */
    $.reg.rowName     = $(this).attr('row');       /* Get row-role-1 */
    $.reg.blueBtn     = $(this).attr('blue');      /* Get blue-btn-1 */

现在弹出一个模式窗口,在单击一些复选框并将数据推送到数组后,当您单击完成按钮(如下)时,所有变量都需要再次保存到命名空间 vars 中。

我的完成按钮单击功能,我试图通过参数变量传递我的命名空间变量

$(".doneButton").click(
    {
        param1: $.reg.masterRole,
        param2: $.reg.role_ID,
        param3: $.reg.rowName,
        param4: $.reg.ary_Check_Role
    },
    doneBtnClicked);

function doneBtnClicked(event){
    alert('$.reg.roleName    = '+$.reg.roleName);
    alert('event.data.param1 = '+event.data.param1);

    masterRole= event.data.param1;
    role_ID  = event.data.param2;
    rowName  = event.data.param3;
    ary_Check_Role = event.data.param4;

请注意上面点击功能中的 2 个警报,第一个将显示正确的值,但第二个不显示任何内容。还有一个问题是让阵列通过。

所以问题:我应该这样做吗?如何正确地将 Array 传递给 jQuery 命名空间,然后将其传递给 click 函数参数?

4

1 回答 1

2

首先,您应该避免将内容放入 jQuery 对象中。为此使用闭包。

第二:您应该使用 HTMLdata-...属性和jQuerydata()将自定义属性附加到 HTML 元素。避免使用非标准属性。

第三:您可以为事件处理程序使用单独的命名函数定义,但是当您实际将这些函数重新用于代码中的不同元素时(您似乎没有这样做),这是最有意义的。例如,使用直接传递给 的匿名函数会.click()产生更易于理解的代码。

// use this shorthand instead of $(document).ready(function () { ... });
$(function () {

  // variable reg will be available to all functions 
  // defined within this outer function. This is called a closure.
  var reg = { 
    masterRole : " ", 
    role_ID : " ",
    row_Name : " ",
    ary_Check_Role : []
  };

  $(".roleButton").click(function (event) {
    // modify state
    reg.masterRole  = $(this).html();            /* Get role name: Actor */
    reg.role_ID     = $(this).data('role');      /* Get role-1 */
    reg.rowName     = $(this).data('row');       /* Get row-role-1 */
    reg.blueBtn     = $(this).data('blue');      /* Get blue-btn-1 */

    // note that this requires markup like this:
    // <button data-role="foo" data-row="bar" data-blue="baz">

    // ...
  });

  $(".doneButton").click(function (event) {
    // debug output
    alert(JSON.stringify(reg, 2, 2));
  });

});

使用多个$(function () { ... });块来分隔应该分开的东西。

不要忘记始终使用var您声明的每个变量。没有声明的变量var将是全局的 - 你不想要全局变量。

于 2013-05-02T14:59:19.013 回答