var button = document.getElementById('btn');
function f1() {
button.disabled = true;
button.onclick = todo.shift(); // заменили обработчик на следующий из очереди
var timeoutID = setTimeout( /* запуск таймера */
function() { button.disabled = false},
1000
);
}
var todo = []; // очередь одноразовых задач
todo.push(f1,f1,f1); // три раза f1, потом добавьте "другие" - f2, f3
button.onclick = todo.shift(); // зарядить первую
list-group-item
:document.body.addEventListener('click', function(e) {
if( e.target.classList.contains('list-group-item'))
e.target.style.backgroundColor = 'red';
});
<body>
можно повесить слушателя ниже, например, на <ul>
, чтобы ловить события только в его дочерних элементах (и глубже). for(let key,i=0;i<localStorage.length;i++) key=localStorage.key(i),console.log(key,':', localStorage.getItem(key));
const L=localStorage;for(let k,v,i=0;i<L.length;i++) {k=L.key(i);try{v=JSON.parse(L.getItem(k)).name}catch(e){};console.log(k,' => ',v)}
function pairs( arr) {
var result = {};
for( var i = 1; i<arr.length; i+=2) result[ arr[i-1]] = arr[i];
return result;
}
pairs(["item1","black","item2","black","item3","black","item4","black","item5","black"]) // {
"item1": "black",
"item2": "black",
"item3": "black",
"item4": "black",
"item5": "black"
}
$n = count( $_POST);
$n = 0;
foreach( $_POST as $key) if( substr( $key, 0, 5) === 'input') $n++;
echo "Пришло $n значений.";
if( filter_has_var ( INPUT_POST, 'input999' )) {
// да, есть такой input999
}
contents()
input
, а не клавиатурные.var curNode
, startOffset
, arrIN = ['--','<<','>>','->','<-']
, arrOUT = ['—','«','»','→','←']
;
arrIN = arrIN.map(function(s){ return new RegExp(s,'g')});
$('#edit').on('input', onInput);
function onInput() {
var selObj = window.getSelection()
, range = selObj.getRangeAt(0)
;
curNode = range.startContainer;
startOffset = range.startOffset;
$(this).contents().each(walk);
range.setStart(curNode, startOffset);
}
function walk(i, node){
var len
, diff
;
if( node.nodeType === Node.TEXT_NODE) {
len = node.textContent.length;
node.textContent = replacer(node.textContent);
diff = len - node.textContent.length;
if( node === curNode && diff) {
startOffset -= diff;
}
} else if( node.nodeType === Node.ELEMENT_NODE) {
$(node).contents().each(walk);
}
}
function replacer(s) {
var i;
for( i = 0; i < arrIN.length; i++) s = s.replace( arrIN[i], arrOUT[i]);
return s;
}
var active = undefined; // здесь будет jQuery( активный пункт )
var $sortable = $('a.sortable'); // пунктов с сортировкой потом может быть больше 1
$sortable.data('sort', true); // true == asc, false == desc
$('a.clickme').on('click', function() {
var $el = $(this);
$sortable.removeClass('asc').removeClass('desc'); // у всех убрать сортировку
if( $el.hasClass('sortable')) { // кликнули переключаемый пункт
if( active && $el[0] === active[0]) { // он был уже активен
$el.data('sort', !$el.data('sort')); // изменили сортировку на другую
$el.addClass( $el.data('sort') ? 'asc' : 'desc') // переключили классы соотв.
.removeClass( $el.data('sort') ? 'desc' : 'asc');
} else {
$el.addClass( $el.data('sort') ? 'asc' : 'desc'); // просто добавили правильный класс
}
}
if( active) active.removeClass('active'); // выключить предыдущий активный эл.
active = $el.addClass('active'); // включить активность кликнутого
});
ar.length = 0
var ar = [1, 2, 3];
ar.sum = function() {
return this.reduce(function(a, b) {
return a + b;
});
}
ar.length = 0; // значений больше нет, но метод sum() остался
ar.push(5, 6, 7); // добавляем новые значения
ar.sum() // 18
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3;
ctx.strokeStyle = "green";
ctx.beginPath();
ctx.moveTo(4,4);
ctx.bezierCurveTo(160, 330, 160, 330, 316, 4);
ctx.stroke();
if .. else
continue
или return
потому, что это не выражения, принимающие какие-то значения, а управляющие структуры.return isItTrue ? A : B;
return
и continue
годится только старый добрый if .. else