<g>
.:hover
при наведении мышки пришлось обернуть SVG в <div>
200 * 6 / 2 = 600
связей (чуть меньше из-за краёв).W = Math.max(0, D - Math.abs( length - D))/D
, где D – пороговая дистанция.W * (time - timeUpdated)
stroke-dashoffset
, так, чтобы штрих появлялся, создавая эффект прорисовки.ctx.putImageData(imagedata, dx, dy);
ctx.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
выдрать из него кусочек.. например [0, 0, 10, 10]
var pixels = context.getImageData(0, 0, 320, 240);
var data = pixels.data; // в data попадает одномерный массив.
target.putImageData( pixels, 15, 15, 0, 0, 10, 10);
/*
15, 15 – где разместить (отступив по 15px слева сверху в target'е)
0, 0 – откуда копировать в координатах context'а
10, 10 – ширина, высота региона копирования
*/
arr2 = arr2.filter(e => !~arr.indexOf(e));
// facebook.com,ya.ru
~
которое даст 0 в единственном случае, когда операнд равен -1. Его отрицание !
даст true в том же единственном случае. Итого эта функция вернёт true только, если элемент не найден в массиве arr. function test(varbl) {
varbl = varbl || 0;
alert(varbl);
}
test();
test( 100500);
var varbl;
if( Math.random() > 0.5) varbl = 100500;
&&
принимает значение true
в единственном случае – если оба операнда true
.a && b
проверяет по очереди: сначала, приводится ли к значению true
первый операнд, a
? Если нет, то дальше проверять нет смысла и выражение возвращает первый операнд, а
.a
не пустой и при переводе в логическое true | false даёт таки true
, то так же проверяется второе выражение, b
.jj(false)
.return +a[attr] > +b[attr] ? 1: -1;
return +a[attr] - b[attr];
const sortFunc = function sortFunc(data, elem) {
switch( elem.getAttribute('name')) {
case 'id':
case 'salary':
data.sort((a, b) => +a[attr] - b[attr]);
break;
case 'user':
case 'position':
case 'gender':
data.sort((a, b) => a[attr] > b[attr] ? 1 : (a[attr] < b[attr] ? -1 : 0));
break;
default:
throw('Bad attribute');
}
};
00 01 02
10 11 12
20 21 22
00 : 0+0 = 0
10, 01 : 1+0 = 0+1 = 1
20, 11, 02: 2+0 = 1+1 = 0+2 = 2
var arr = [
'o,x,x'.split(','),
'x,o,o'.split(','),
'o,x,o'.split(','),
];
var r, c, key, diags = {};
for(r = 0; r < arr.length; r++) {
for(c = 0; c < arr[r].length; c++) {
key = r + arr[r].length - 1 - c; // слева сверху вправо вниз
// key = r + c; // слева снизу вправо вверх
if( diags.hasOwnProperty(key)) {
if( diags[key] !== arr[r][c]) diags[key] = false;
} else {
diags[key] = arr[r][c];
}
}
}
for( key in diags) if( diags[key] === false) delete diags[key];
// {"0":"x","2":"o","3":"x","4":"o"}
user_params()
отработает сразу и вернет null. А ответ от ВК будет получен когда-то потом и попадёт во вложенную функцию.function user_params(id, param, callback) {
vk('users.get', {user_ids: id, fields: param}, function(error, response){
if (error) {
console.log(error);
} else callback(response[0][param]);
});
};
function roundTS(ts) {
var D = new Date(ts);
var m = 15 + Math.ceil( D.getMinutes() / 15);
D.setMinutes(m);
return D.getTime();
}
function roundMinArr( D, arr) {
var i, m = D.getMinutes();
arr.sort((a,b)=>a-b);
for(i in arr) {
if( arr[i] < m) continue;
D.setMinutes(arr[i]);
return D;
}
D.setMinutes(60 + arr[0]);
return D;
}
var D = roundMinArr( new Date('2017-08-16T12:17+03:00'), [0,15,35,44,59]);
D.toString() // Wed Aug 16 2017 12:35:00 GMT+0300 (MSK)
this.a=[
new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'),
new Audio('https://wav-library.net/prmusic/rock/Run.mp3')
];
this.f=()=>{ // это будет новый обработчик клика
var cc=!!this.cc; // для краткости записи
this.a[+!cc].pause(), // если предыдущий длинный играет - стоп его!
this.a[+!cc].currentTime=0, // ..и перемотать на начало.
a[+cc].play(), // играть новый
this.cc=!cc // переназначить счётчик ( true | false )
};
this.onclick=this.f, // переназначить хэндлер клика
this.f() // вызвать для первого клика принудительно
<td onclick="this.a=[ new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'), new Audio('https://wav-library.net/prmusic/rock/Run.mp3')];
this.f=()=>{var cc=!!this.cc;this.a[+!cc].pause(),this.a[+!cc].currentTime=0,a[+cc].play(),this.cc=!cc};
this.onclick=this.f,this.f()">click me!</td>
function getById( obj, id) {
var i, found;
if( obj.id === id) return obj;
if( obj.hasOwnProperty('childGroups')) {
for( i in obj.childGroups) {
if( found = getById( obj.childGroups[i], id)) return found;
}
}
return;
}
getById( obj,3) // {"id":3,"parentId":1,"childGroups":[{"id":6,"parentId":3},{"id":7,"parentId":3}]}