具有动态创建元素的事件处理程序的全局变量范围
Global variable scope with event handler for dynamically created element
我想根据全局状态变量更改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
的值是多少,但我不知道如何修复它。
用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);
}
});
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default