2017-01-04 7 views
0

Так что я получил эту работу с первым значением х для толкания и сращены, но после того, как он только толкает или не делать что-либоПочему по щелчку, если проверяется неисправность после контакта с 2 + индексом в массиве

for(x in aL.results){$('#tblListings').append(
      '<tr>' 
       +'<td> 
    <input type="checkbox" name="updateListings[]" value='+x+' onclick="doSomething(this)"> 
</td>+'</tr>' 
     );} 
function doSomething(cb) { 
    if ($(cb).is(":checked")) { 
     uLIndex.push(cb.value); 
     alert(uLIndex); 
    } else { 
     uLIndex.splice(cb.value, 1); 
     alert(uLIndex); 
    }  
} 
+0

'cb.value' не является индексом в массиве, это строка (" '+ x +' "). См. ['Сращивание'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) – Teemu

+0

Проведенное событие onchange все тот же результат, установив флажок 2 и сняв флажок и повторно проверка rsult равна 1,1 –

+0

Пожалуйста, перечитайте мой комментарий, а также документацию, которую я связал. – Teemu

ответ

2

Ваша проблема заключается в том, что вы передаете строковое значение этого поля в slice(). Вместо этого вам нужно указать числовой индекс элемента для удаления в массиве. Вы можете использовать indexOf(), чтобы получить, что:

var uLIndex = []; 
 

 
function doSomething(cb) { 
 
    if ($(cb).is(":checked")) { 
 
     uLIndex.push(cb.value); 
 
     console.log(uLIndex); 
 
    } else { 
 
     uLIndex.splice(uLIndex.indexOf(cb.value), 1); // note the change here 
 
     console.log(uLIndex); 
 
    }  
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="checkbox" name="updateListings[]" value="1" onclick="doSomething(this)"> 
 
<input type="checkbox" name="updateListings[]" value="2" onclick="doSomething(this)"> 
 
<input type="checkbox" name="updateListings[]" value="3" onclick="doSomething(this)"> 
 
<input type="checkbox" name="updateListings[]" value="4" onclick="doSomething(this)">

отметить также, что она считается лучшей практикой используйте ненавязчивые обработчик событий над атрибутами теперь устарело on* события. Вы также можете упростить код для построения массива при каждом нажатии, используя метод jQuery map(), вместо того, чтобы вручную отслеживать добавления/удаления. Попробуйте это:

$('input:checkbox').change(function() { 
 
    var uLIndex = $('input:checkbox:checked').map(function() { 
 
    return this.value; 
 
    }).get(); 
 
    console.log(uLIndex); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="checkbox" name="updateListings[]" value="1"> 
 
<input type="checkbox" name="updateListings[]" value="2"> 
 
<input type="checkbox" name="updateListings[]" value="3"> 
 
<input type="checkbox" name="updateListings[]" value="4">

Как и большинство вещей, которые вовлекают JQuery, эта версия имеет преимущество использования гораздо более простой логики, но быть немного медленнее (хотя мы говорим только миллисекунды). Если вам нужен более высокий уровень производительности, я бы сказал, что вы, вероятно, вообще не должны использовать jQuery.

+0

Хотя в вашем втором решении я заинтересован, есть 2 разных блока checkbox для двух разных функций, как можно различить java-script ... –

+0

Я не уверен, что вы имеете в виду - он все еще строит один и тот же массив. Логика обоих примеров имеет тот же результат. –

+0

Мне просто интересно, есть ли два разных набора флажков, один для списков, а другой позволяет произносить только название или редактировать заголовок и описания или даже любые возможности. поэтому он работает с установленными списками, но как он может выглядеть по-разному при просмотре заданных свойств. –