我有这个脚本:
JS
// A & B is needed
var needed = ["#n01", "#n03"];
// always holds what the user has clicked
var user = [];
// needed + user
var mixed = [];
// takes care of highlighting clicked letters &
// updating the user array
function hilit ( elem, cssClass ) {
$( elem ).click( function () {
if( $( this ).hasClass( cssClass )){
//remove from array "highlighted"
user.splice( $.inArray( "#" + $( this ).attr( "id" ), user ), 1 );
$( this ).removeClass( cssClass );
} else {
// add to array array "highlighted"
user.push( "#" + $( this ).attr( "id" ) );
$( this ).addClass( cssClass );
}
});
}
// is something wrong here? it works locally...
$("#lorem").on("click", function() {
// merging -> needed + user
mixed = $.merge(needed, user);
// removing duplicates
var map = new Object();
for ( var i = 0; i < mixed.length; i++ ) {
if (map[mixed[i]] === undefined ){
map[mixed[i]] = 1;
}
else{
map[mixed[i]]++;
}
}
// result = letters the user didn't click
var result = new Array();
for( var i = 0; i < mixed.length; i++ ){
if( map[mixed[i]] > 1 ){
//do nothing
}
else{
result.push(mixed[i]);
}
}
)};
hilit (".letter", "color");
测试用例在这里(谢谢你,CD..!):http: //jsfiddle.net/uDsum/2
HTML
<p id="lorem">
<span class="letter" id="n01">A</span>
<span class="letter" id="n02">B</span>
<span class="letter" id="n03">C</span>
</p>
CSS
body {
font-size: 160px;
font-weight: bold;
}
.letter {
cursor: pointer;
}
.color {
background: red;
}
</p>
描述
段落中的每个字母#lorem
都用span
.letter
. 单击时.letter
,将检查该类.color
是否存在。如果是,.color
则删除并从数组中删除相应的 ID user
。否则color
添加并将 id 推入user
.
有你数组needed
:user
和mixed
。
needed
保存用户需要点击的ID。user
保存用户单击的 ID。mixed
是用户并且需要合并。
每次点击,都会needed
合并user
到mixed
. 结果是mixed
持有一些 ID 两次。然后过滤掉这些重复项,在数组中留下用户应该点击但没有点击的元素的 ID result
。
问题
好吧,起初:我直接从我的编辑器中获取了代码,但不知何故它无法正常工作。我在脚本中断的地方添加了评论。这是 JSfiddle 的怪癖还是我搞砸了什么?
单击带有 的元素后.color
,ID 应该只在 中出现一次mixed
。反而是现在出现了三遍。所以不是在 中删除它hilit
,而是再次添加它。为什么会这样?我该如何解决这个问题?这与我的使用有关on()
吗?
非常需要和感谢任何帮助!