Ответы пользователя по тегу JavaScript
  • Нужна помощь в создании скрипта?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Погуглите DOM
    Ответ написан
    Комментировать
  • Как скрыть отображение адреса всех ссылок в браузере одним скриптом?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    document.querySelectorAll('a').forEach(a=>{
    	if(!a.href || !(a.href.indexOf('http')===0)) return;
    	let href = a.href;
    	a.removeAttribute('href');
    	a.addEventListener('click',e=>{
    		location.href = href;
    	});
    });

    Но этот скрипт испортит некоторые хитрые кнопки. Так что надо доделывать либо под конкретный сайт, либо думать, как определять кнопки в универсальном варианте скрипта.
    Немного улучшенный вариант:

    Но нет предела совершенству. Улучшать можно бесконечно.
    document.querySelectorAll('a').forEach(a=>{
    	//a.style.backgroundColor = 'red'; //красным проигнорированные
    	if (a.href && a.href.indexOf('javascript:') === 0) {
    		//a.style.backgroundColor = '#ff0'; //желтым скриптованные ссылки
    		let eval_str = a.href.substr(11);
    		a.addEventListener('click',e=>{
    			eval(eval_str);
    		});
    		a.removeAttribute('href');
    		return;
    	}
    	if(!a.href || !(a.href.indexOf('http')===0)) return;
    	let c = a.className;
    	if (c.indexOf('button') > -1 || c.indexOf('btn') > -1 || c.indexOf('like') > -1 || c.indexOf('reply') > -1) return;
    	if (a.querySelector('svg') || a.querySelector('img')) return;
    	if (a.style.borderRadius) return;
    	//a.style.backgroundColor = '#0f0'; //зеленым очищенные ссылки
    	let href = a.href;
    	a.removeAttribute('href');
    	a.addEventListener('click',e=>{
    		location.href = href;
    	});
    });
    Ответ написан
    5 комментариев
  • Как получить атрибут выбранного option'а?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуйте так:
    document.getElementById("myselect").addEventListener("change",
      function () {
        let opt;
        for(let i=0;i<this.children.length;i++){
          let child = this.children[i];
          if(this.value == child.value) {
            opt = child;
            break;
          }
        }
        if(!opt)return;
        let for_attr = opt.getAttribute("data-price") || "???";
        document.getElementById('mydiv').innerHTML = "Вес брутто*: "
            + for_attr;
      }
    );
    Ответ написан
  • Функции проведения JSON?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нет. Готовых функций нет.

    Хотя сделать такое не сложно. Главное, знать, что хотеть. Из ваших примеров это ни разу не очевидно. В них не прослеживается закономерность и куча несостыковок. Вероятно, вы очень спешили, когда их составляли. Так что я даже не уверен, что вы сами знаете, что вам нужно. Но зато я уверен, что как только вы начнете делать (или начнете составлять ТЗ), то сразу поймете, что вам нужно, а что не нужно.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Универсальный способ в лоб - взять и создать отдельную функцию.
    Код
    let modal = document.getElementById('modal');
    let modal2 = document.getElementById('modal2');
    
    function commonFn(e) {
        e.style.display = "block";
    }
    
    link.onclick = function() {
        commonFn(modal);
    }
    
    link2.onclick = function() {
        commonFn(modal2);
    }

    Более хитрый, но странный способ - каким-то образом получить массив элементов. Способы есть разные, не о них речь.
    Код
    let modal = document.getElementById('modal');
    let modal2 = document.getElementById('modal2');
    
    let links = [link, link2];
    let modals = [modal, modal2];
    
    links.forEach((L,i)=>L.onclick = function() {
        modals[i].style.display = "block";
    });

    К слову, вместо .onclick= лучше использовать .addEventListener('click',

    Ну и наиболее правильный, как мне кажется, способ - это каким-то образом связать каждый link с соответствующим modal. Выше эта связь происходит через индекс в массиве. Но может быть, что можно как-то по-другому, через цепочку соседних или родительски-дочерних элементов вычислить. В идеале у link и modal должны быть похожие атрибуты, с помощью которых функция в onclick, зная атрибут у link, сможет вычислить атрибут у modal, а затем найти его по этому атрибуту на странице. Например, одинаковый класс (один из).
    Ответ написан
    Комментировать
  • Как элегантнее всего сделать функцию, которая округляет число, только если он ближе 0.1 к целому, иначе nil?

    dollar
    @dollar Автор вопроса, куратор тега Lua
    Делай добро и бросай его в воду.
    local function round_or_nil(num)
    	local res = math.floor(num + 0.5)
    	local diff = math.abs(res - num)
    	return (diff <= 0.1 or diff >= 0.9) and res or nil
    end
    Ответ написан
    Комментировать
  • Почему alert закрывается без воздействия с пользователем?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Мысль первая - баг чего? Вы не указали ни браузер, ни его версию.
    Мысль вторая - отправить баг репорт разработчикам. Желательно предварительно изучить баг до степени воспроизводимости на чистом браузере в виртуалке.
    Ответ написан
    Комментировать
  • Как ввести в инпут только цифры?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Плохо запрещаете, раз остаются буквы.
    Весь код в студию! (Если большой, то нужными частями или под спойлер).
    Регулярка сама по себе ничего не запрещает. Запрещает код, который пользуется в том числе регуляркой.
    Ответ написан
    Комментировать
  • Как изменить локальную переменную?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если это глобальная функция, то расширение Tampermonkey. Ещё зависит от "тут еще какой-то код", потому что можно подменить всю функцию целиком, а можно подменить функцию, которая использует функция и т.д. Ну и ещё важно успеть подменить до того, как она будет вызвана, так что это тоже накладывает свои ограничения на способ инжекта. Если же всё завёрнуто в анонимную обёртку, то это мёртвый номер, хотя иногда и можно кое-как схитрить через манипуляцию с DOM, но это опять же от кода зависит.

    Иначе в ход идёт тяжелая артиллерия - приложение Fiddler. С его помощью сможете локально в вашем личном браузере подменить любую часть скрипта перед его выполнением. Но потребуется время на освоение этой софтины.

    Обычно нужно просто заблокировать скрипт или элемент на чужом сайте. Подозреваю, что именно это, а не то что вы задумали, может быть на самом деле простым решением. Для этого подойдут современные блокировщики рекламы. Лучший на сегодня - uBlock Origin.
    Ответ написан
    Комментировать
  • Почему не меняется цвет из поля?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что плохой стиль делать так:
    onclick = "func_1()"

    Не делайте так. Лучше сделайте по-современному в самом JS примерно так:
    document.getElementsByTagName('button')[0].addEventListener('click',func_1);

    Ну, можете через поиск по id или как угодно. Суть в том, чтобы не навешивать onclick в html, чтобы всё было вперемешку, а делать скрипты отдельно в секции для скриптов. Ну а html - чисто разметка.
    Ответ написан
    Комментировать
  • Замыкания в чем конкретно разница?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не работает, потому что к тому времени, когда функция onclick будет вызвана, переменная i дойдет до самого конца цикла. И будет использоваться именно это, последнее значение.

    В первом варианте переменная i используется в конкретной итерации, т.е. берется photos[i] и это значение дальше передаётся, а сама переменная i больше не используется, так что в целом пофиг, как там она дальше будет изменяться.

    Ведь в первом варианте вызов addThumbnailClickHandler(thumbnails[i], photos[i]) происходит прямо в цикле, сразу, без промедлений, а не откладывается на потом. В этот момент конкретные значения передаются в качестве параметров. И далее из-за замыкания они так и остаются висеть в памяти и ссылаться на то, что нужно.

    Немного изменим код, и он снова перестанет работать :)
    var i;
    
    var addThumbnailClickHandler = function (thumbnail) {
      thumbnail.addEventListener('click', function () {
        fullPhoto.src = photos[i]; // i === thumbnails.length
      });
    };
    
    for (i = 0; i < thumbnails.length; i++) {
      addThumbnailClickHandler(thumbnails[i]);
    }
    Ответ написан
    Комментировать
  • Как уйти от использования async в js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "ajax.txt", false);
    xhr.send(); //Скрипт остановится до получения ответа
    document.getElementById("demo").innerHTML = xhr.responseText;
    Ответ написан
    Комментировать
  • Как сократить выражение в условном операторе?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вообще быстрее будет не перебором массива, пусть и встроенной функцией, а поиск по хешу. Да и в целом, думаю, красивее, хотя дело вкуса:
    const hashes = [ DIV:1, P:1, SPAN:1, ... ];
    if (hashes[el.nextSibling.nodeName]) {
      ...

    Хотя это и экономия на спичках. Но если проверок сотни и тысячи, то хеш-таблица однозначно выгоднее.
    Ответ написан
    7 комментариев
  • Какие знания нужны junior JS dev?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это весь синтаксис javascript. А также встроенные объекты.

    Без циклов и массивов вы как бы вообще не сможете ничего написать, кроме "hello world". Изучите теорию по учебникам или по спецификациям, заправляя это небольшой практикой. Да, это не развлечение. Никто не обещает, что будет легко и весело.

    А программистом себя могут называть те, кто имеют приличный опыт, как плохой, так и хороший. То есть для звания "программист" вам нужно просто много работать по данному направлению. Желательно, чтобы ваш код оценивали. Но вы и так поймете, что ваш код плохой, когда не сможете в нем ориентироваться, и при этом он будет страшно бажным.
    Ответ написан
    8 комментариев
  • Как вывести всё что больше ста до 0?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В чём сложность? Задание на знание языка.
    Можно сделать как-то так
    function funcCounter(num) {
    	let cnt = this.cnt || 0; //Создаем счетчик вызовов
    	cnt++; //увеличиваем счетчик вызовов
    	this.cnt = cnt; //Запоминаем счетчик
    	if (typeof num != "number" || !isFinite(num)) return cnt;
    	if (num < 100) { //вызовы от этого числа
    		if (cnt >= num) return cnt - num;
    		return 0;
    	}
    	if (num > 100) { //от 0 до числа
    		if (num < cnt) return num;
    		return cnt;
    	}
    	return cnt; //num is 100
    }
    Ответ написан
    1 комментарий
  • Как загрузить iframe с помощью chrome.proxy?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    content_script и background общаются через сообщения. Нужно сделать обработчик в background и обращение к нему в content_script.

    В background так:
    chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
      if (request.type == "myMessage") { //можно обойтись без типов
        let v = request.v; //12345
        // ...что-то сделать
        sendResponse({answer: 'ok'}); //не обязательно
      }
    }


    В контент скрипте как-то так:
    chrome.runtime.sendMessage({
      type: "myMessage", //тип сообщения, если их несколько
      v: 12345,  //какие-то данные нужно переслать в background
      }, function(data) { //callback, если нужно
        if (data.answer == 'ok') console.log('всё в порядке');
      }
    });
    Ответ написан
    6 комментариев
  • Как использовать import?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Комментировать
  • Перебрать массив?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var arr = [12, '+', 13, '/', 5];
    var result = eval(arr.join(''));
    console.log(result);

    Скопируйте этот код в консоль и увидите, что он работает.
    Ответ написан
    Комментировать
  • Как сделать правильно анимацию прыжка персонажа на блок?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вы считаете новые координаты от начальных, а нужно считать новые координаты от предыдущих.

    Если ваша игра усложнится, то вам это сильно поможет. Например, если будет потолок, об который можно стукнуться, то прыжок прервется и начнется свободное падение.

    То есть вам нужна простая физика (известная вам со школы) - скорость и ускорение. В момент прыжка есть только начальные координаты и вектор скорости. Всё. В качестве ускорения есть гравитация (тянет всегда вниз) плюс можно разрешить пользовательское ускорение стрелками клавиатуры, а можно и не разрешать, зависит от геймплея.

    Таким образом, что касается блока, то в момент прыжка будут просто другие начальные координаты. Функции прыжка должно быть пофиг, что это за координаты, она просто задает вектор скорости, если есть поверхность, от которой можно оттолкнуться. Дальнейший расчет движения уже проблема не функции прыжка, а других функций.
    Ответ написан
    Комментировать
  • Убрать прелоадер когда загрузились указанные секции?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не используйте прелоадер вообще.
    Люди без JS скажут вам спасибо.

    По теме: в нужном месте страницы вставьте script, который без всякого 'load' события убирает прелоадер.
    Ответ написан
    Комментировать