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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    window.scrollTo(999999, 0);
    Ответ написан
  • Как получить элементы html по классу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var tabs = document.getElementById('tabs');
    tabs.querySelectorAll('.tab-link').forEach(e=>e.style='color:red;');

    А ещё лучше так
    var tabs = document.getElementById('tabs');
    tabs.querySelectorAll('.tab-link').forEach(e=>e.style.color='red');
    Ответ написан
    Комментировать
  • Как через браузер отследить активность пользователя?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Активность можно отслеживать только в текущей вкладке. Это банальные требования к безопасности и конфиденциальности браузера.

    Если пользователь увел мышь за пределы окна текущей страницы, то вы никак не отследите движения и активность.

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

    Посмотрите Motivate Clock - это старый проект, один из первых, кто стал измерять время пользователя, потраченное на разные задачи. В какой-то момент они сделали также и расширение для браузера, чтобы там отслеживать активность. Можете у них поучиться всякому.

    Ну а активность вне браузера через JS ясное дело тем более нельзя отслеживать. К сожалению разработчиков. И к спокойствию юзеров, что сайты за ними не следят. Нужно делать нативное приложение для ОС.
    Ответ написан
    Комментировать
  • Десктопное приложение на javascript,в чем ошибка?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А приложение вообще работает? alert(123) выводит?

    Если да, то, скорее всего, просто нельзя менять локацию. Попробуйте ajax к www.ok.ru, а контент формируйте динамически тем скриптом, который является частью приложения - это будет как бы ядро вашего приложения, в котором будет вся логика загрузки контента и его отображения.
    Ответ написан
    Комментировать
  • Как удалить скрипт со страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В общем случае удалить скрипт нельзя.

    Иногда возможен костыль. Для глобальных функций можно их переопределить, заменив другими. И вообще многие глобальные переменные можно удалить. Обработчики можно удалить все, если есть доступ к обработчику, то есть ссылка на функцию не спрятана где-нибудь в замыкании или какой-то локальной области видимости.

    Но если, к примеру, весь код банально обёрнут в анонимную функцию, то он практически невидимый извне. С ним ничего нельзя сделать. Можно только при следующей загрузке страницы не загружать этот скрипт. И обычно много всего спрятано именно так, в замыканиях, в стеке.
    Ответ написан
    Комментировать
  • Как реализовать обратный скролл страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Думаю, можно сделать легко. Как-то так:
    1) Делаем страницу без скролла, которая умещается в экран.
    2) На странице несколько дивов с размерами 100%, которые накладываются друг на друга, то есть это как бы слои. И вот эти дивы уже со скроллом.
    3) Верхний див сделать невидимым. В нём с некоторой периодичностью, а также по событию проверяется текущая позиция скролла и используется в вычислениях.
    4) Нижний див, соответственно, принимает это значение и программно меняет позицию своего скролла в обратном направлении.

    Проблема только в обычном взаимодействии со страницей. Я не уверен, как можно ловить только скролл верхним дивом, а всё остальное (клики, тапы) пропускать. Можно легко сделать, чтобы вся мышь или тач были прокинуты к нижнему диву, но тогда схема теряет смысл. В общем, думаю, можно как-то ловить клик, считать его координаты и передавать ниже.
    Ответ написан
    Комментировать
  • Как подключить js файл в html через проверку на js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В PHP достоверно проверить действительный адрес нельзя. Но достаточно надёжно можно проверять $_SERVER['HTTP_REFERER']. Если он ссылается на страницу1, то всё ок, а если нет, то скорее всего страница2 открывается в браузере напрямую.

    В JS нет смысла делать что-либо в "проверку на js" (я так понимаю, вы про noscript), потому что в этом случае js не работает вообще. Поэтому делайте в инлайн js скрипте так:
    1) Если JS работает И если это фрейм, то подгрузить js файл.
    Если inline скрипт не сработал, то в noscript можно просто попросить включить JS, и по умолчанию js файл грузиться не будет (в этом просто нет смысла, как я уже сказал).
    Ответ написан
    2 комментария
  • Как сделать кнопку неактивной при снятии чекбокса?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно создать глобальную переменную, в которой хранить число активных чекбоксов.
    • Если чекбокс активирован, то активируется кнопка, и переменная увеличивается на +1.
    • Если чекбокс деактивирован, то переменная уменьшается на 1, и если она стала равна 0, то кнопка деактивируется.
    Ответ написан
  • Как правильно отлавливать изменения time на js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function enoughTime() { // Возвращает true, если прошло больше 2 секунд
      let now = (new Date()).getTime();
      if (!enoughTime.save) enoughTime.save = now/2;
      if (now - enoughTime.save < 2000) return false;
      enoughTime.save = now;
      return true;
    }
    Ответ написан
    Комментировать
  • Как прервать setTimeout?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что timerId у тебя локальный. Он виден только внутри функции, и не сохраняется по завершению функции. Так что где бы ты его ни использовал, timerId будет не определён. Объявляй его вне функции или запоминай в чём-то, что существует дольше.
    spoiler
    var header = document.querySelector('.sticky');
    var timerId; //объявляем глобально!
    
    window.onscroll = function showHeader () {
      if (window.pageYOffset > 138) {
        header.classList.remove('goback');
        header.classList.add('sticky-header');
      } else {
        header.classList.add('goback');
        timerId = setTimeout(function () {
      		header.classList.remove('sticky-header');
        }, 250)
      }
    }
    
    if (window.pageYOffset > 138) {
      header.classList.add('sticky-header');
    }
    Ответ написан
  • Как изменить состояния всех чекбоксов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function setCheckAll() {
    	let c;
    	document.querySelectorAll('input[type=checkbox]').forEach(e=>{
    		if (e.id=='main-checkbox') return (c=e.checked);
    		e.checked=c;
    	});
    }
    Ответ написан
    Комментировать
  • Как доработать кнопку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <button type="button" onclick='demo=document.getElementById("demo");!window.mysave?(mysave=demo.innerHTML):0;demo.innerHTML = demo.innerHTML==mysave?"Hello JavaScript!":mysave'> Click Me!</button>

    https://codepen.io/anon/pen/agvdQv
    Ответ написан
  • Как принять только N-ный параметр функции?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Обработать последний аргумент функции:
    Код
    function foo() {
      console.log(arguments[arguments.length-1]);
    }
    
    foo(1,2,3,4,5,6,7); // 7
    Ответ написан
    Комментировать
  • Как сделать тест знаний на чистом javascript?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Я делаю все вопросы в отдельной структуре.
    Примерно так
    var data = [
    	{
    		name:'Психотип - это',
    		radio:['темперамент','акцентуация','соционический тип','экстраверсия','архетип','характер','ничего из этого'],
    		answer: 7,
    	},
    	{
    		name:'Что позволяет игра с точки зрения социологов?',
    		checkbox:['выразить себя','снять запреты','снять напряжение',],
    		answer: 1 + 10, //+100
    	},
    	{
    		name:'Что есть игра с точки зрения биогенетиков?',
    		checkbox:['атавизм','приготовление к жизни','снятие напряжения',],
    		answer: 1, // +10 +100,
    	},
    	// и так далее
    ];

    А на экране показываю одновременно только один вопрос и кнопку "Дальше". То есть DOM формируется динамически. Причем, при показе вопроса варианты ответов перемешиваются (кроме вариантов "ничего из вышеперечисленного" и "всё вышеперечисленное", которые добавляются в конец).

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

    К слову, тест знаний делать на js - так себе идея. Ведь шпаргалка открывается в два клика (или комбинацией Ctrl+U) и читается без навыков программирования. По уму вопросы и ответы должны перемешиваться на сервере, id ответов должны быть каждый раз произвольные типа fGx9PeL7, подсказки ответа в js коде не должно быть вообще (проверка ответа только на сервере), вопросы должны отдаваться не все сразу, а порциями через ajax, ну и на каждый вопрос должно отводиться ограниченное время. А если лимита времени нет, то придется физически стоять над душой респондента и смотреть, чтобы он не лез в Гугл за подсказками. Ведь тест знаний должен проверять знания в предметной области, а не хакерские способности или скорость гугления.
    Ответ написан
    4 комментария
  • Как сравнять значения в localStorage?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    localStorage.Mam = localStorage.Dad;
    Ещё
    localStorage["Mam"] = localStorage["Dad"];
    Ответ написан
    7 комментариев
  • Как транслировать C-функцию в JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Примерно так:
    spoiler
    5cffc12bb1f03295195783.jpeg

    Но можно и самому легко. Там всё очевидно, как работает. Просто учти, что в JS символы условно двухбайтовые, то есть код символа где-то примерно от 0 до 65535.
    Ответ написан
    Комментировать
  • Как добавить уникальные свойства в название выпадающего списка?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function makeDOM(html) { //Формируем DOM на основе структуры
    	for(let category in html) {
    		let det = document.createElement('details');
    		let cat = document.createElement('summary');
    		cat.innerText = category;
    		det.appendChild(cat);
    		html[category].forEach(o=>{
    			let button = document.createElement('button');
    			button.className = o.k;
    			button.innerText = o.id;
    			det.appendChild(button);
    		});
    		document.body.appendChild(det);
    	}
    }
    
    let html = {};
    function makeButton(o) { //Формируем структуру
    	if (typeof o !== "object") return;
    	if (o instanceof Array) {
    		let k = o[o.length-1];
    		o.forEach(e=>{e.k=k,makeButton(e)});
    		return;
    	}
    	if (!o.id) {
    		for(let k in o) makeButton(o[k].concat([k]));
    		return;
    	}
    	let summary;summary = html[o.category] ||(summary = html[o.category] = []);
    	summary.push({k:o.k,id:o.id});
    }
    
    window.addEventListener('DOMContentLoaded',e=>{
    	makeButton({A:A,B:B,C:C,D:D});
    	makeDOM(html);
    });
    Ответ написан
    4 комментария
  • Возможно ли создать слайдер с применением функций-генераторов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да, возможно.
    Ответ написан
    Комментировать
  • Как вникнуть в ES2016, ES2017, ES2018?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Посмотрите в Википедии. Ну и Гугл тоже может помочь, как бы это оскорбительно и занудно ни звучало.

    Но вы не торопитесь юзать новые фичи. Не все оперативно обновляют свои браузеры. Так что ES2016 лучше начинать юзать в 2021, ES2017 - в 2022 и т.д. В этом плане ES2015 исключение, слишком крутой скачок, а дальше хоть трава не расти.
    Ответ написан
    2 комментария
  • Как сделать кроссдоменный ajax запрос в chrome extensions (расширение для хрома)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В расширениях для бразуера есть не только юзер скрипты, но и, так называемая, фоновая страница или фоновый скрипт (одно и то же). Это как бы скрытая вкладка самого расширения, которая всегда активна, пока активно расширение. В этой вкладке прямо в js можно хранить всё то, что нужно для работы расширения, а также выполнять задачи, затрагивающие расширение в целом. Например, можно делать ajax к любым доменам.

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

    Дать права можно в манифесте. Вот так выглядят права на все сайты (плюс на табы):
    "permissions": [
    	"<all_urls>", "tabs"
    ],

    Вот пример другого набора прав (на конкретные сайты плюс всякое):
    "permissions": [
    	"https://toster.ru/*", "https://habr.com/*", "notifications", "storage"
    ],
    Ответ написан
    1 комментарий