Ответы пользователя по тегу JavaScript
  • Как реализовать фичи в расширении?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1.
    существует 3-и типа скриптов
    Все три сразу можно и даже нужно, если требуется для целей расширения. Единственное, content script на все сайты пользователи не любят, т.к. расширение получает слишком много опасных с точки зрения приватности и безопасности прав. А вот content script на конкретный сайт (со ссылками на прокси) или 2-3 сайта - можно, это выглядит хорошо.

    2.
    Запрос на получение и модификацию popup.html, popup.js не дает
    Расширению нужны права на доступ к www.proxybeatch.io (либо доступ вообще ко всем сайтам):
    "permissions": [ "https://www.proxybeatch.io/*" ],

    3.
    как общаться из background.js в popup.js

    Никак.
    popup.js - временный скрипт. Он выгружается, когда закрывается окно. Хотя это зависит от браузера, может остаться фантомно - это тонкий момент, который нужно учесть при разработке для Firefox и Chrome одновременно.
    Вообще можно из popup обратиться к background и там оставить ссылку на себя. Но обращение по этой ссылке опасно.
    Лучше делать так: в background происходят все основные процессы и имеют разную степень готовности. А popup просто получает готовую инфу и отображает её. Сам popup при этом никуда не стучится, а отдает задания для background, который уже неспешно занимается обновлением и сортировкой данных.

    4.
    бэйдж не из popup.js а из background.js

    Не знаю, в чем сложность. Бейдж устанавливается абсолютно также. Вероятно, у вас какой-то баг в коде.

    5.
    Как сделать периодическую проверку

    setInterval()
    Ну или есть вариант через alarms, но в целом без разницы.

    6.
    прокси с вэб страницы. Такое возможно?

    Возможно. Это должен быть либо ваш сайт, либо вы должны хорошо знать формат, в котором представлены списки прокси. Проблема решается контент скриптом для данного конкретного сайта. Этот скрипт добавляет к ссылкам соответствующий обработчик, или даже целую кнопку рядом с инфой о прокси.

    7.
    анимированное разворачивание popup, как отключить?

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    На странице есть скрипт, который отслеживает клавиатурные и прочие события, но не обнаруживает их. Поэтому думает, что пользователь ничего не ввёл. Вам нужно сгенерировать эти события, чтобы тот скрипт проверил новое значение, его валидность, и разрешил следующий шаг.
    Ответ написан
    2 комментария
  • Как написать правильно условие if в if-e, чтобы после 10 го символа часть текста скрывалась и вместо них появлялись три точки(..)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function getArgument(str) {
    	if (typeof str != 'string') str+='';
    	if (str.length <= 10) return str;
    	str = str.slice(0, 10) + '...';
    	return str;
    }
    console.log(getArgument('test'));
    console.log(getArgument('test_test_test'));

    Чем меньше вложенности, тем лучше. Так что, по возможности, избегайте ситуаций if в if'е и более глубоких.
    Ответ написан
    1 комментарий
  • У кого-то этот код работает так же?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вместо
    alert(x);
    попробуйте
    alert(performance.now());
    Тогда увидите, как на самом деле: через секунду или больше.
    Ответ написан
    Комментировать
  • Почему не работает javascript в PWA?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Проблема может быть в ошибке javascript. Либо синтаксическая, тогда весь код не работает. Либо фатальная, тогда весь код ниже места с ошибкой не работает.

    Ещё может быть, что javascript отключён в браузере.
    В iOS, например, есть такая опция
    5d1f16f737090033183598.png
    Ответ написан
  • Как на стороннем сайте ВООБЩЕ запретить переход по ссылкам и открытия новых окон в браузере? Какой код ввести в консоли?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала проверьте запрет новых окон в браузере. Для этого: в хроме перейдите в настройки и введите там в строке поиска "всплывающие окна", потом внесите сайт в список блокировки.
    spoiler
    5d1ee58a4ce05806866250.png


    Далее попробуйте просто запустить блокировщик рекламы. Авось настройки по умолчанию устранят проблему. Лучшее расширение (на сегодня) - uBlock Origin. Но выбор конкретного расширения - дело вкуса.

    Хотя ещё можно отключить на сайте JavaScript. Это можно сделать средствами браузера: в хроме нужно зайти в настройки и там в поиске набрать javascript, дальше очевидно. Но удобнее использовать расширение. Лично я использую Quick Javascript Switcher (при этом у меня JS по умолчанию отключён везде, и по надобности включаю на некоторых сайтах, но это опять-таки дело вкуса). Ещё есть расширение NoScript. Кстати, блокировщики рекламы тоже умеют блокировать скрипты (см. ниже).

    Иногда некоторые сайты без JS отображают заглушку (placeholder), которая мешает просматривать контент. В большинстве случаев решается тем же блокировщиком рекламы, только нужно создать правило, скрывающее заглушку.
    Пример

    Правило для блокировщика: pcdreams.com.sg###pageloader
    Сайт из примера прекрасно работает без JS, но требуется убрать заглушку.


    Если же без JS совсем никак, то тем же блокировщиком рекламы можно настроить фильтр, который запрещает определенный файл js или даже inline js по какому-то условию (имя файла или содержимое скрипта). Но для этого придется немного окунуться в то, как устроен сайт изнутри. То есть зависит от конкретного сайта.

    Чтобы добавить свой скрипт на страницу, понадобится расширение Tampermonkey. Как подсказали в комментариях, можно попробовать обмануть код страницы и таким способом:
    unsafeWindow.open = e=>0;

    В особо тяжелых случаях нужные скрипты неразрывно смешаны с рекламными (речь не про всплывающие окна), и просто так заблокировать не получится. Честно говоря, таких сайтов я ещё не встречал. Обычно рекламу легко обмануть. Но если такой сайт встретится, и он очень полезный, и от него нельзя отказаться, то в таком случае в ход идёт тяжелая артиллерия - программа Fiddler и очень глубокий анализ скриптов сайта и их изменение, подмена.

    В общем, это война снаряда и брони. В ней не может быть победителя. Но сейчас в среднем по всем сайтам перевес сил на стороне пользователя.
    Ответ написан
    Комментировать
  • Почему Array.prototype является массивом, но к нему нельзя обратиться по индексу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно обратиться по индексу:
    Array.prototype.length; //0
    Array.prototype[0]; //undefined, но не ошибка!
    Array.prototype[0]=123; 
    Array.prototype[0]; //Теперь 123
    Array.prototype.length; //Теперь 1 (автоматически)

    Возможно, вы думали, что массивы не могут содержать свойств? Но массивы - объекты, так что могут:
    typeof Array.prototype; //"object"
    var a = [];
    typeof a; //"object";
    a.x = 123;
    a.x; //123
    a.length; //0

    Кстати, мысль о том, что Array.prototype это массив, довольно спорная, не смотря на документацию. Смотря как проверять:
    [] instanceof Array; //true
    Array.prototype instanceof Array; //false

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

    А в общем случае ответить нельзя, потому что массив или не массив это просто термин. Например, если вам достаточно, чтобы массив содержал лишь метод forEach, то некоторые якобы массивы вам тоже вполне сгодятся:
    document.querySelectorAll('div').forEach; //function - подходит
    document.getElementsByTagName('div').forEach; //undefined - не подходит

    То есть копать можно долго в эту тему. Но надо понимать, зачем.
    Ответ написан
    Комментировать
  • Как работать с массивом?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    https://codepen.io/anon/pen/ororVq
    Дописал к вашему js в конце немного кода.
    Ответ написан
    7 комментариев
  • Как сделать тоже самое через substring?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Легко делается:
    var c = "abcdef";
    var s = "cd";
    
    //Функция вырезает search_text из content
    function removeText(content, search_text) {
    	let found = content.indexOf(search_text); //Ищем позицию текста.
    	if (found === -1) return content; //Текст не найден, без изменений.
    	let part1 = content.substr(0,found); //Берём до совпадения.
    	let part2 = content.substr(found + search_text.length); //Берём после.
    	return part1 + part2;
    }
    
    console.log(removeText(c,s)); // "abef"

    Соответственно, в вашем случае с моей функцией будет так:
    //Вырезаем некоторый текст из content.value
    content.value = removeText(content.value, node.outerHTML);
    Ответ написан
    2 комментария
  • Как найти повторяющееся число в массиве целых чисел?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var arr = [1, 2, 3, 4, 2, 5];
    
    function findDuplicate(arr) {
      var obj = {};
      for(var i=0; i<arr.length; i++) {
        if (obj[arr[i]]) return arr[i];
        obj[arr[i]] = true;
      }
    }
    
    console.log('Повторяющееся число:', findDuplicate(arr));
    Ответ написан
    Комментировать
  • Как найти значение, отсутствующее в одном из массивов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var arr1 = [1, 2, 3, 4, 5, 6, 7];
    var arr2 = [1, 2, 3,    5, 6, 7];
    
    function analyzeArrays() {
    	arr1=arr1.sort().filter(e=>e===0||e);
    	arr2=arr2.sort().filter(e=>e===0||e);
    	if (Math.abs(arr1.length-arr2.length) != 1) return console.log('Пропущено не одно число!');
    	for(let i=0; i<arr1.length; i++) {
    		if (arr1[i] == arr2[i]) continue;
    		if (arr1[i] == arr2[i+1]) return console.log('Число '+arr2[i]+' пропущено в arr1');
    		if (arr1[i+1] == arr2[i]) return console.log('Число '+arr1[i]+' пропущено в arr2');
    		return console.log('Фигня какая-то');
    	}
    	console.log('Число '+arr2[arr2.length-1]+' пропущено в arr1');
    }
    
    analyzeArrays();
    Ответ написан
    Комментировать
  • Как добавить класс элементу из значения переменной?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    element.className += ' ' + burgerClassToggle;

    P.S. Ответ легко гуглится по запросу "javascript add class". В следующий раз постарайтесь хоть немного поискать ответ самостоятельно, прежде чем задавать очевидный вопрос.
    Ответ написан
    1 комментарий
  • Почему внешний скрипт JavaScript не работает?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что нужно разместить скрипт в конце файла, когда все элементы будут засчитаны:
    .....
        <script src="script.js"></script>
      </body>
    </html>

    Либо в скрипте использовать событие DOMContentLoaded, которое срабатывает в конце загрузки документа:
    Код
    var select, html;
    
    function update(bgColor, textColor) {
      html.style.backgroundColor = bgColor;
      html.style.color = textColor;
    }
    
    window.addEventListener('DOMContentLoaded', e=>{
      select = document.querySelector('select');
      html = document.querySelector('html');
      document.body.style.padding = '10px';
    
      select.onchange = function() {
        ( select.value === 'black' ) ? update('black','white') : update('white','black');
      }
    });
    Ответ написан
    Комментировать
  • Нужно ли верстальщику знание canvas? Если да, насколько глубоко?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А что там знать?

    Если вы хорошо знаете сам язык JavaScript, то любую задачу на canvas можно быстро решить, используя документацию или гугл. То есть можете не знать canvas (разве что вам понадобится на собеседовании). Как только появляется задача - начинаете её делать, параллельно открывая документацию. Там всё просто: линии, фигуры, шрифты, а также цвета и стили всего этого добра. И надо будет без какой-либо разметки считать координаты по придуманному вами алгоритму.
    Ответ написан
    Комментировать
  • Почему JS не выводит i в input?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что у вас две ошибки:
    Первая

    Вы пишите onclick="add1". Это не работает, потому что при нажатии на кнопку вычисляется выражение в кавычках. А результатом выражения "add1" является функция. Обратите внимание, не вызов функции, а просто ссылка на функцию.
    Следует писать так: onclick="add1()"

    А вообще хочу заметить, что такой способ создания обработчика слегка морально устарел. По сути он приравнивается к использованию функции eval, а это скверно, не стильно и не модно.
    Более правильный вариант убрать атрибут onclick, а в скрипте добавить обработчик примерно так:
    var button = document.querySelector("button"); //как-то получаем указатель
    button.addEventListener("click", add1); //добавляем сам обработчик

    Вторая

    Внутри функции add1 вы увеличивает глобальную переменную на единицу.
    И переменная действительно увеличивается (если первая ошибка уже исправлена).
    Однако это никак не отображается на странице.
    Потому что переменная и значение инпута - не одно и то же.
    Исправлением будет перенос операции копирования внутрь функции:
    function add1(){
      i++;
      inp1.value = i;
    }

    Вот теперь копирование будет происходит при каждом вызове функции, а не только при загрузке страницы.
    Ответ написан
    4 комментария
  • Как заставить исполняться функцию, каждые 500px прокрутки страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var old = 0;
    window.addEventListener("scroll", function() {
      let now = Math.floor(window.pageYOffset / 500);
      if ( now > old ) {
        console.log("Очередные 500", now);
        old = now;
      }
    }, false);
    Ответ написан
    Комментировать
  • Как проверить равны ли три переменные через if?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    if (randomBoolean==randomBooleanItemOne && randomBoolean==threeRandomItem) {
      this.returnItemBoolian();
    }
    Ответ написан
    Комментировать
  • В чём отличия между js плагином и библиотекой?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Плагин - это модуль, который расширяет функционал основного приложения.
    Что такое "js плагин" я не знаю. Вы откуда вообще взяли такое сочетание слов?
    В целом можно сказать, что js плагин - это синоним библиотеке, но так обычно библиотеку не называют.
    Ответ написан
    2 комментария
  • Как использовать кириллицу в js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сам файл должен быть сохранен в кодировке UTF-8.
    Ответ написан
    Комментировать