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
if .. else
continue
или return
потому, что это не выражения, принимающие какие-то значения, а управляющие структуры.return isItTrue ? A : B;
return
и continue
годится только старый добрый if .. else
parseFloat
чтобы стали числами:var coords = "55.759906, 37.622242;50.455898, 30.521481";
coords = coords.split(';').map( e => e.split(', ').map(parseFloat));
//[[55.759906,37.622242],[50.455898,30.521481]]
// или вариант для старых браузеров:
coords = coords.split(';').map( function(e){ return e.split(', ').map(parseFloat)});
var size = 30, blogContent = $('.block p');
blogContent.each(function(e){
var $el = $(this), html = $el.html();
if( html.length > size) html = html.slice(0,size) + '…<a href="#" class="read-more-button">read more</a>';
$el.html(html);
});
…
i
на число картинок:var i = 0;
var image = document.getElementById("image");
var imgs = new Array('play.png','pause.png','play.png','pause.png'); // Добавте свои картинки через запятую
function imgsrc(){
i++;
image.src=imgs[i%imgs.length];
}
var i = 0;
var image = document.getElementById("image");
var imgs = new Array('play.png','pause.png','play.png','pause.png'); // Добавте свои картинки через запятую
function nextImage(){
if(i++ >= imgs.length) i = 0;
image.src=imgs[i];
}
function imgsrc() { window.setInterval( nextImage, 500) }
var target, pos = {dx:0, dy:0};
function onMouseDown(e){
target = $(e.target);
pos.dx = parseInt(target.css('left').replace('px','')) - e.pageX;
pos.dy = parseInt(target.css('top').replace('px','')) - e.pageY;
}
function onMouseMove(e){
var dx, dy;
if(!target) return;
target.css({
left: (e.pageX + pos.dx) + 'px'
});
}
function onMouseUp(e){ target = undefined }
$('.dragme').on('mousedown', onMouseDown);
$('#container').on('mousemove', onMouseMove);
$('#container').on('mouseleave', onMouseUp);
$('.dragme').on('mouseup', onMouseUp);
g
, после очередного найденного совпадения поиск продолжается.var RE = /([A-z0-9])/g;
console.log([
RE.lastIndex, RE.test("aaaa"), // 0,true
RE.lastIndex, RE.test("aaaa"), // 1,true
RE.lastIndex, RE.test("aaaa"), // 2,true
RE.lastIndex, RE.test("aaaa"), // 3,true
RE.lastIndex, RE.test("aaaa"), // 4,false
RE.lastIndex, RE.test("aaaa"), // 0,true
]);
var tRish = "tits_rish_a1 tits_rish_a2 tits_rish_a3";
var tRishClasses = tRish.split(' ').map(e=>'.' + e).join(', '); // список классов .tits_rish_a1, .tits_rish...
var tClick = "#tits_click_a1, #tits_click_a2, #tits_click_a3";
$(function() {
function onClick(e) {
var n = (n = this.id.match(/b(\d+)/)) ? n[1] : null; // n == 1, 2 или 3
if(!n) return;
$(tClick).removeClass(tRish).addClass( 'tits_rish_a' + n);
// $(tClick).attr('id', 'tits_click_a' + n); // id менять некошерно!
$(tRishClasses).attr('style', '');
}
$('#b1, #b2, #b3').on('click', onClick);
});
#b2 => 2
и далее использует полученный номер для составления классов/id. var $el = $('h1');
var s = $el.text().split(/\s+/);
var i, h = {curr:0, prev:0}, parts = [], word, back=[];
while(s.length) {
word = s.shift();
back.push(word);
$el.html( back.join(' '));
h.curr = $el.height();
if( h.curr !== h.prev) {
parts.push([]);
h.prev = h.curr;
}
parts[ parts.length - 1].push(word);
}
parts = parts.map((e,i) => '<span class="row'+i+'">' + e.join(' ') + '</span>');
$el.html(parts.join("\n"));
function search( search, subject, before) {
var limit = subject.indexOf( before);
if( limit == -1) return -1;
return subject.substr(0, limit).indexOf( search);
}
search( 'строка 2', 'строка 1 строка 2 строка 3 строка 4', 'строка 3') // 9
str.substr(0,41).indexOf('что ищем')
function convert(s) {
var c, i, bo = 0, div = "\u0083", arr = s.split('');
for( i = 0; i < arr.length; i++) {
c = arr[i];
if( c === '[') {
bo++;
} else if( c === ']') {
bo--;
} else if( bo > 0 && c === ' ') {
arr[i] = div;
}
}
return arr
.join('')
.split(' ')
.map( function(s){ return s.replace( new RegExp(div,'g'), ' ')})
;
}
var s = "слово1 слово2 [слово слово слово] слово3";
convert(s) // ["слово1","слово2","[слово слово слово]","слово3"]