Задать вопрос
  • Как нарисовать сетку внутри ромба?

    @Interface
    Возможно, имеет смысл смотреть в сторону паттернов:
    https://www.w3schools.com/tags/canvas_createpattern.asp
    Ответ написан
    Комментировать
  • Как проверить елементы в строке на повторяемость?

    @Interface
    Может вы хотите перемешать массив? stackoverflow.com/questions/6274339/how-can-i-shuf...
    Если нет - то проверка на повторяемость это например
    const isRepeated = (i, id, arr) => arr.indexOf(i) !== id || arr.indexOf(i, id + 1) !== -1;
    ...
    [1,2,3,4,1,3].map(isRepeated);
    Ответ написан
    Комментировать
  • Для чего нужно это указывать тип второй раз?

    @Interface
    То что идет после двоеточия - тип возвращаемого функцией значения. https://www.typescriptlang.org/docs/handbook/funct... Не очень понял про второй раз - первый это аргумент или return newSquare;. TS (современный по крайней мере) сам определит тип по такому return. Т.е. часть после двоеточия - необязательна, но добавляет наглядности
    P. s. это также поможет избежать ошибки при попытке сделать невалидный return внутри функции
    Ответ написан
    Комментировать
  • Возможно ли найти слабое звено производительности JS в автоматическом режиме?

    @Interface
    https://developers.google.com/web/tools/chrome-dev...
    https://developers.google.com/web/updates/2016/12/...

    Для ноды это так же можно прикрутить. Насчет FF не знаю, но не думаю, что он будет вызывать специфические проседания.
    Ответ написан
    Комментировать
  • Как можно создать объект с DOM элементами и присвоить им классы?

    @Interface
    В заголовке вы задаете вопрос, а ниже на него отвечаете сами. Могу предположить что ваше решение не работает.
    Выскажу 2 замечания:
    1) такую конструкцию:
    var activeElements = new Object();
        activeElements.main = jQuery('.nav-horizontal .menu li a.active'),
        activeElements.Blog = jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-menu-item'),
        activeElements.Post = jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-post-ancestor'),
        activeElements.Category = jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-category-ancestor')

    можно заменить на более компактную:
    var activeElements = {
        main: jQuery('.nav-horizontal .menu li a.active'),
        Blog: jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-menu-item'),
        Post: jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-post-ancestor'),
        Category: jQuery('.nav-horizontal .menu li.menu-item-type-taxonomy.current-category-ancestor')
    }

    Плюс в вашем коде надо заменить запятые на точку с запятой в конце. Но на работоспособность это повлиять не должно.

    2-е замечание) цикл for-in ( https://developer.mozilla.org/ru/docs/Web/JavaScri... ) в цикле изменяет переменную ключ в объекте
    Иными словами:
    var obj = {a: 1, b: 2, c: 3};
    for (var i in obj) {console.log(i)} // выведет поочередно: [a,  b,  c], а не 1-2-3 как можно было подумать 
    // чтобы это исправить, можно использовать такой подход:
    for (var i in obj) {console.log( obj[i] )}; // 1, 2, 3

    В вашем случае должно помочь:
    ...
    for (var i in activeElements) {
        var elementMenu = activeElements[i];
        if (elementMenu.length) {
    ...
    Ответ написан
    Комментировать
  • Как передать в DOM html код(в виде обычного текста)?

    @Interface
    Хм... Если я вас правильно понял, то ваша проблема в том, что браузер вставляет ваш фрагмент кода "<img src="+img+" />" как картинку, а не как код этой картинки. Далее исхожу из того, что это ваша проблема. Если нет - попробуйте переформулировать вопрос с читого листа.

    Ниже есть 5 способов решения этой проблемы (каждое отмечено комментарием// Решение №), а пока предлагаю разобраться почему так происходит:
    // Здесь jquery парсит конструкцию и вставляет ее как HTML node. 
    // Причем вставляет он в итоге 2 тега: img и br
     $('<img src="' + img + '"></br>').appendTo('.body');


    Нам нужно сказать браузеру: вставь это как текст
    Для этого есть говорящие свойство .textContent - https://developer.mozilla.org/ru/docs/Web/API/Node...
    Также есть метод jQuery: text() - api.jquery.com/text
    /*
     * это просто перепишет все 
     * содержимое в цикле, в итоге в конце 
     * останется только одна запись
     */
    $('.body').text('<img src="' + img + '"></br>')
    // можно попробовать так:
    $('.body')[0].textContent += '<img src="' + img + '"></br>'
    /*
     * это не лучшее решение, 
     * потому как потеряется вся разметка
     * для остальной части страницы,
     * но это приемлимо (не считая оверхеда)
     * если весь текст лежит в одном блоке:
     */
     $('.img-links')[0].textContent += '<img src="' + img + '"></br>'
    // тем не менее, не лучший подход на мой взгляд


    Можно собрать все фрагменты кода и вставить один раз:
    ...
    // Решение 1
    success: function(data) {
    	var parts = [];
        data.response.forEach(function(item) {
            var img = item.size;
    
            (!(img)) ? img = item.src_big : img; // проверяем, есть ли самое большое разрешение у фотографии
            parts.push('<img src="' + img + '"></br>');
        });
        $('.img-links').text(parts.join(''));
    }
    ...


    Здесь вроде все ясно. Зайдем с другой стороны:
    Если бы я захотел изначально показать на странице текст вида <img src="http://my.awesome.link">,
    то использовть js было бы неудобно. Как я могу сказать браузеру "не превращай это в DOM"?
    Я вижу 2 подхода:
    - расположить этот текст в специальном теге htmlbook.ru/html/xmp (или можно даже в )
    - заescape'ить служебные символы: "<" -> "&lt;", ">" -> "&gt;"

    1) подход:
    ...
    // Решение 2
    $('<xmp><img src="' + img + '"></xmp>').appendTo('.body');
    // пожалуй, один из самых простых способов
    ...

    2) подход:
    ...
    $('&lt;img src="' + img + '"&gt;').appendTo('.body'); // не сработает
    // потому что jQuery не умеет вставлять текстовые ноды
    // или избегает этого, вместо этого вставится первый валидный тег
    // это можно решить - ввести контейнер:
    
    
    // Решение 3
    $('<span>&lt;img src="' + img + '"&gt;</span><br>').appendTo('.body'); 
    ...

    Можно ли избежать писания в ручную этих страшных &lt; / &gt;?
    Можно!
    Используя js-функцию для эскейпинга: например отсюда stackoverflow.com/questions/5499078/fastest-method...
    Но тут скорее напрашивается другое решение, близкое к тому, с чего мы начали:
    Можно использовать .textContent / .text() - чтобы за нас эскейпил браузер / jQuery:
    ...
    // Решение 4
    $( $('<span/>').text('<img src="' + img + '"><br>') ).appendTo('.body'); 
    ...


    И еще одно весьма изящное решение, которое я, надо признаться подсмотрел на StackOverflow ( stackoverflow.com/questions/6588630/jquery-append-text ):
    Мы можем сами сказать браузеру, что нам нужна текстовая node и передать ее в jquery:
    ...
    // Решение 5
    $('.body').append(document.createTextNode('<img src="' + img + '">'));
    Ответ написан
    1 комментарий
  • Checkbox Group?

    @Interface
    codepen.io/Int0h/pen/JEzwxm

    По второму пункту:
    Можно повесить (что я и сделал) на общего родителя обработчик onclick, а там задавать checked если все чекбоксы проставленны (можно сделать с помощью es5 - Array.every)
    Ответ написан
    2 комментария
  • Работа с объектами в JS?

    @Interface
    Судя по всему, вы обрезали часть с как раз таки заданием, потому как на картинке просто повествование. Что сделать из него (мне лично) не ясно.

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

    John = {
        "english": {
            level: "basic",
            intensity: 3/7
        },
        "french": {
            level: "advanced",
            intensity: 1/7
        }
    }


    Возможно вам помогут лучше\быстрее если сформулируете задачу полностью.
    Ответ написан
    Комментировать
  • Как на JS создать цикл для неупорядоченного массива?

    @Interface
    Ну тут напрашивается обычный цикл for (key in array){...}

    UPDATE
    :
    Если вам действительно нужно обрабатывать огромные разреженные массивы на javascript и подвешивать процесс не желательно (что на самом то деле надо избегать вообще), то можно попробовать делать это асинхронно как писали Константин Отпущенников и evg_ (однако они не предложили как можно итерировать объект асинхронно, а нам нужна итерация именно объекта, а не массива в данном случае). Так вот я нашел одно решение, оно довольно.. кхм.. специфическое, если придумаете способ лучше - пишите. Проблема в том, что мы можем перебрать часть свойств мегообъекта и break'нуться из цикла, но мы не сможем вернуться в то же место, поэтому надо как-то добиться запоминания состояния цикла... и единственное, что я нашел - это удалять элементы первоначального объекта (их можно и восстановить в другой, но вы это можете добавить сами если будет нужно).
    Особенности метода:
    - изменение изначального объекта;
    - скорость просядет на порядки (без преувеличений, у меня этот способ оказался в 200 - 400 раз медленее);
    - зато можно не вешать всю страницу;
    - выбирать порцию данных за один проход (чем больше, тем медленнее алгоритм для одной части (больше тормозов на странице), за то быстрее обработка в целом);
    - можно повесить прогресс бар, отображающий прогресс итерации;

    Код:
    var arr = [];
    for (var i = 0; i < 100 * 1000; i++){
    	arr.push(i);
    };
    
    function bench(name, fn){
    	var startTime = performance.now();
    	var res = fn();
    	var finishTime = performance.now();
    	console.log(name + ' took: ', finishTime - startTime);
    	return res;
    };
    
    bench('get keys', ()=>
    	Object.keys(arr) // ~670 ms
    );
    
    // --------------
    
    function getKeyValAsync(bigObject, limit, cb){
    	var result = [];
    
    	function getPart(){
    		var doneAmount = 0;
    		for (var i in bigObject){
    			if (!bigObject.hasOwnProperty(i)){
    				continue;
    			};
    			result.push({
    				key: i,
    				val: bigObject[i]
    			});			
    			delete bigObject[i];
    			doneAmount++;
    			if (doneAmount > limit){
    				setTimeout(() => bench('part: ', getPart), 10);
    				return;
    			};
    		};
    		cb(result);		
    	};
    
    	getPart();
    };
    
    var keyValPairs;
    var start = performance.now();
    getKeyValAsync(arr, 10000, res => {
    	keyValPairs = res;
    	console.log('By parts time: ' + (performance.now() - start));
    });
    Ответ написан
    8 комментариев
  • Почему в условии "o" есть true в Javascript?

    @Interface
    Судя по этой конструкции:
    var wincomb = innerArr[i][j] && innerArr[i][j+1] && innerArr[i][j+2];

    я так понимаю, вы расчитываете, что в переменной wincomb окажется "X". Однако, там окажется булева переменная, т.е. true/false. При этом false там будет, если каждый из этих:
    innerArr[i][j];
    innerArr[i][j+1];
    innerArr[i][j+2];

    элементов будет пустой строкой.
    Затем вы сравниваете if(wincomb == "X"){
    результат (булева переменная) со строкой, которая приведется также к булевой, а так как строка это "Х", то всегда будет приводиться к true.

    В вашем случае в коде довольно сложно разобраться, поэтому исправить вашу проблему затруднительно. Скорее всего лучше будет писать заново большую часть. Советую обратить внимание на правописание англоязычных переменных.
    Ответ написан
  • Как вызвать метод несколько раз в зависимости от возвращаемого результата?

    @Interface
    Попробуйте так:
    var field = 0; // init value
    
    function callback(result){
    	field = result.field;
    	if (field < 10){
    		object.foo(field, callback);
    	};
    };
    object.foo(field, callback);

    https://jsfiddle.net/pmceqnck/

    Возможно object.foo - асинхронный, тогда метод Finesse (если я не ошибаюсь не работает)
    Ответ написан
    2 комментария