点击不更新计数
Count not updating on click
我有两个多选菜单,我试图在其中获取加载时每个多选中总共有多少个子项,然后根据从一个菜单推送到另一个菜单的点击事件更新数字,或相反亦然。
加载部分工作正常。我得到了我期望的结果并且计数是准确的。
我遇到的问题是在点击事件触发后更新这两个计数。我的计数永远不会改变。
这是我的代码以及 fiddle:
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var availableUserCount = $("#availableUsers option").length;
var eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
$('#availableUsers').click(function () {
return !$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.length(function() {
return availableUserCount();
});
eligibleUser.length(function() {
return eligibleUserCount();
});
});
$('#eligibleUsers').click(function () {
return !$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
activeUser.length(function() {
return availableUserCount();
});
eligibleUser.length(function() {
return eligibleUserCount();
});
});
http://jsfiddle.net/mujaji/8gkLyfe3/3/
我做错了什么?
您的代码似乎有 3 个问题。
- 您在点击事件的第一行使用了
return
。所以下面的代码永远不会执行(Get rid of that and only return if you cannot find any options
)
- div 元素没有名为
length
的方法。 (Use .text() instead
)
- 当您在函数 return 中输入长度
return availableUserCount();
时,它会 return 为您提供缓存的值。 (You need to reselect the element again
)
所以你的代码在技术上应该看起来像这样(仍然可以进行进一步的重构)
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var availableUserCount = $("#availableUsers option").length;
var eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
$('#availableUsers').click(function () {
!$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.text(function() {
return $("#availableUsers option").length;
});
eligibleUser.text(function() {
return $("#eligibleUsers option").length;
});
});
$('#eligibleUsers').click(function () {
!$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
activeUser.text(function() {
return $("#availableUsers option").length;
});
eligibleUser.text(function() {
return $("#eligibleUsers option").length;
});
});
$("#availableUsers option").length 不会随着选项的数量而动态变化。一旦你把它设置在顶部,它就永远是 40。这就是你想要的:
$('#availableUsers').click(function () {
$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.text($("#availableUsers option").length);
eligibleUser.text($("#eligibleUsers option").length);
});
虽然可以的时候每次都重新查询效率不高
availableUserCount--; eligibleUserCount++;
并手动跟踪它。
在函数的第一行使用 return 可以防止在该块中执行任何其他代码。
查看我的 fiddle 以了解执行此操作的功能化方法
function setUserCounts(){
availableUserCount = $("#availableUsers option").length;
eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
}
http://jsfiddle.net/8gkLyfe3/6/
本质上,我们添加了这个函数,然后从点击处理程序中调用它,同时也删除了
最佳解决方案(原文如此):D
/*JQUERY FUNCTIONS*/
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var eligibleUserCount = function(){eligibleUser.html($("#eligibleUsers option").length)};
var availableUserCount = function(){activeUser.html($("#availableUsers option").length)};
eligibleUserCount();
availableUserCount();
$('#availableUsers').click(function () {
$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
availableUserCount();
eligibleUserCount()
});
$('#eligibleUsers').click(function () {
$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
availableUserCount();
eligibleUserCount()
});
我有两个多选菜单,我试图在其中获取加载时每个多选中总共有多少个子项,然后根据从一个菜单推送到另一个菜单的点击事件更新数字,或相反亦然。
加载部分工作正常。我得到了我期望的结果并且计数是准确的。
我遇到的问题是在点击事件触发后更新这两个计数。我的计数永远不会改变。
这是我的代码以及 fiddle:
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var availableUserCount = $("#availableUsers option").length;
var eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
$('#availableUsers').click(function () {
return !$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.length(function() {
return availableUserCount();
});
eligibleUser.length(function() {
return eligibleUserCount();
});
});
$('#eligibleUsers').click(function () {
return !$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
activeUser.length(function() {
return availableUserCount();
});
eligibleUser.length(function() {
return eligibleUserCount();
});
});
http://jsfiddle.net/mujaji/8gkLyfe3/3/
我做错了什么?
您的代码似乎有 3 个问题。
- 您在点击事件的第一行使用了
return
。所以下面的代码永远不会执行(Get rid of that and only return if you cannot find any options
) - div 元素没有名为
length
的方法。 (Use .text() instead
) - 当您在函数 return 中输入长度
return availableUserCount();
时,它会 return 为您提供缓存的值。 (You need to reselect the element again
)
所以你的代码在技术上应该看起来像这样(仍然可以进行进一步的重构)
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var availableUserCount = $("#availableUsers option").length;
var eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
$('#availableUsers').click(function () {
!$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.text(function() {
return $("#availableUsers option").length;
});
eligibleUser.text(function() {
return $("#eligibleUsers option").length;
});
});
$('#eligibleUsers').click(function () {
!$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
activeUser.text(function() {
return $("#availableUsers option").length;
});
eligibleUser.text(function() {
return $("#eligibleUsers option").length;
});
});
$("#availableUsers option").length 不会随着选项的数量而动态变化。一旦你把它设置在顶部,它就永远是 40。这就是你想要的:
$('#availableUsers').click(function () {
$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
activeUser.text($("#availableUsers option").length);
eligibleUser.text($("#eligibleUsers option").length);
});
虽然可以的时候每次都重新查询效率不高
availableUserCount--; eligibleUserCount++;
并手动跟踪它。
在函数的第一行使用 return 可以防止在该块中执行任何其他代码。
查看我的 fiddle 以了解执行此操作的功能化方法
function setUserCounts(){
availableUserCount = $("#availableUsers option").length;
eligibleUserCount = $("#eligibleUsers option").length;
activeUser.html(availableUserCount);
eligibleUser.html(eligibleUserCount);
}
http://jsfiddle.net/8gkLyfe3/6/
本质上,我们添加了这个函数,然后从点击处理程序中调用它,同时也删除了
最佳解决方案(原文如此):D
/*JQUERY FUNCTIONS*/
var activeUser = $('.activeUsers');
var eligibleUser = $('.eligibleUsers');
var eligibleUserCount = function(){eligibleUser.html($("#eligibleUsers option").length)};
var availableUserCount = function(){activeUser.html($("#availableUsers option").length)};
eligibleUserCount();
availableUserCount();
$('#availableUsers').click(function () {
$('#availableUsers option:selected').remove().appendTo('#eligibleUsers');
availableUserCount();
eligibleUserCount()
});
$('#eligibleUsers').click(function () {
$('#eligibleUsers option:selected').remove().appendTo('#availableUsers');
availableUserCount();
eligibleUserCount()
});