【问题标题】:Global variable scope with event handler for dynamically created element具有动态创建元素的事件处理程序的全局变量范围
【发布时间】:2016-01-28 02:56:57
【问题描述】:

我想根据全局状态变量更改 Bootstrap 下拉菜单的行为。如果uiState 变量在单击时是'normal',它应该显示下拉菜单,但如果它处于另一个状态,它应该做其他事情。我有以下代码:

$(document).ready(function () {
    var uiState = 'normal';

    // Load HTML for word control from server
    var wordUiElement;
    $.get('/static/word_ui_element.html', function (data) {
        wordUiElement = data;
    });
   var nwords = 0;
   var testClickCounter = 0;

   // Make it so dropdowns are exclusively controlled via JavaScript
   $(document).off('.dropdown.data-api')

   $('#ui-add-word').click(function (event) {
       var control = wordUiElement.replace(/wx/g, 'w' + nwords.toString());
       $('#ui-spec').append(control);
       nwords++;
   });

   $('#ui-change-state').click(function (event) {
       if (uiState === 'word_select') {
           uiState = 'normal';
       } else {
           uiState = 'word_select';
       }
       console.log(uiState);
   });

    $('#ui-spec').on('click', '.dropdown .dropdown-toggle', function (event) {
        if (uiState === 'normal') {
            $(this).dropdown('toggle');
        }
        else {
            testClickCounter ++;
            console.log(testClickCounter);
        }
    });

});

但是,当下拉列表被动态创建时,它们的行为似乎是基于创建下拉列表时uiState 变量的内容而固定的。

这意味着如果在将uiState 变量设置为'normal' 时创建了一个下拉列表,那么无论单击它时uiState 是什么,它都将始终显示或隐藏下拉列表。另一方面,如果下拉列表是在uiState'word_select' 时创建的,它将始终递增并记录testClickCounter。就好像处理程序中的 if 语句在创建下拉列表时被评估一次,并保留 uiState 的值在创建时的任何值。

我认为这是一个范围问题,并且事件处理程序在创建时执行。我希望它在单击时检查uiState 的值是什么,但我不知道如何解决。

【问题讨论】:

  • 也许我不明白,但我真的不希望你在那里尝试做 :)
  • 它们基于 HTML 数据属性,为按钮发布您的 HTML。
  • 您希望每个下拉菜单都有自己的状态吗?目前你有一个全局的uiState 变量!
  • 请告诉我们uiState的值在哪里改变。
  • 不,他们不需要自己的状态。我将添加其余代码

标签: javascript jquery scope jquery-events


【解决方案1】:

data-toggle="dropdown" 实例化元素,并在它改变状态时删除该属性,例如:

$('#wx').attr('data-toggle',''); // Dropdown no longer shows

$('#wx').attr('data-toggle','dropdown'); // Dropdown shows again

触发器的其余部分照常继续:

$('#wx').on('click', '.dropdown .dropdown-toggle', function (event) {
    if (uiState !== 'normal') {
        testClickCounter ++;
        console.log(testClickCounter);
    }
});

【讨论】:

  • 这并不能解决问题。我试图解释得更清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多