Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #181 (permalink)  
Старый 28.08.2018, 21:00
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

Всем привет!
Есть несколько мелких вопросов:

1. Почему счетчик, вызванный первым способом, работает корректно, а вторым - нет?
let counter = () => {
	let i = 0;

	return () => i++;
};

let cnt = counter();

console.log(cnt(), cnt(), cnt());	//	0 1 2

console.log((counter())(), (counter())(), (counter())());	// 0 0 0

2. Какой из этих двух вариантов реализации суммирующей функции лучше (выразительнее и быстрее)?
let sum = (...arr) => {
	if (arr.every(item => typeof(item) === "number")) return arr.reduce((acc, cur) => acc + cur, 0)
	else throw new Error("wrong type");
};

let sum2 = (...arr) => arr.reduce((acc, cur) => {
	if (typeof(cur) === "number") return acc + cur;
	else throw new Error("wrong type");
}, 0);

3. Как вообще работает этот код?
console.log(20e-1["toString"](2));		// 10
Ответить с цитированием
  #182 (permalink)  
Старый 28.08.2018, 21:19
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,612

1. Во втором случае создаются и сразу вызываются три разных счётчика. Естественно каждый из них находится на нуле.

2. Второй, очевидно: два полных перебора массива против одного. Единственное что else можно убрать, return всё равно прерывает дальнейшее выполнение в случае успеха if.

3. NeX - экспоненциальная запись числа, равносильно: N умножить на 10 в степени X. (т.е. в данном случае: 20 * 10 ** -1 == 2)
O["x"]() - вызов метода x объекта O. (отличается от O.x() только тем, что можно использовать строку).
N.toString(base) - метод приводящий число N к строке в base системе счисления. (в данном случае двоичной: 2 == 102 )
__________________
29375, 35

Последний раз редактировалось Aetae, 28.08.2018 в 21:26.
Ответить с цитированием
  #183 (permalink)  
Старый 07.09.2018, 22:55
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

1. Почему не получается выбрать DOM элемент плеера vimeo?

<!DOCTYPE html>
<html lang="ru">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width initial-scale=1 shrink-to-fit=no">
    <title>JS</title>
</head>

<body>
    <iframe src="https://player.vimeo.com/video/76979871" width="640" height="360" frameborder="0"></iframe>
    <script src="https://player.vimeo.com/api/player.js"></script>
    <script>
    	let bar = document.querySelector(".play-bar"); // выбор полосы воспроизведения
    	console.log(bar); // null
    </script>
</body>

</html>


2. Есть сайт, у которого на первой странице ссылка на вторую, а на второй - кнопка. Можно ли ввести в консоль на первой странице такой скрипт, чтобы сработал переход по ссылке, а потом клик по кнопке?
Нерабочий вариант:

let link = document.querySelector("a");
setTimeout(() => {
    let btn = document.querySelector("button");
    btn.click();
}, 5000);
link.click();
Ответить с цитированием
  #184 (permalink)  
Старый 09.09.2018, 22:50
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,612

1. iframe - отдельный полноценный документ. В текущем документе существует как элемент только сам iframe. Вам нужно лезть внутрь:
document.querySelector("iframe").onload = function(){ //ждём пока загрузится
  let bar = this.contentWindow.document.querySelector(".play-bar"); // выбор полосы воспроизведения
  console.log(bar);
}
Но работать это будет только если данный код используется под доменом "vimeo.com" или vimeo посылает серверные разрешающие заголовки. В обычном случае это работать не будет: ограничения безопасности. Скорее всего у vimeo есть откртый api для управления.

2. Это возможно при соблюдении двух условий:
а) Как и в предыдущем случае, обе страницы должны быть под одним доменом, либо вторая должна посылать рзрешающие заголовки.
б) Ссылку открываем в новой вкладке\окне.
var win = window.open(link.href);
win.onload=function(){
    let btn = win.document.querySelector("button");
    btn.click();
}
__________________
29375, 35
Ответить с цитированием
  #185 (permalink)  
Старый 30.09.2018, 18:51
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

Пишу библиотеку для работы с классами ES5. Не знаю, как задать имя функции через аргумент метода.

function Classes() {
	this.createClass = function(className, keys) {
		this[className] = function(...values) { // здесь как-то надо указать className в качестве имени функции
			keys.map(key => this[key] = values[keys.indexOf(key)]);
		};
		return this;
	};
}

let classes = new Classes();
classes.createClass("Test", ["a", "b"]);
let test = new classes.Test(1, 2);
console.log(test);	//	(anonymous function) {a: 1, b: 2} вместо Test {a: 1, b: 2}


Нашел подходящий способ с использованием new Function(), однако не могу в нем разобраться:
function renameFunction(name, fn) {
	return (new Function(`return function (call) { return function ${name} () { return call(this, arguments) }; };`)())(Function.apply.bind(fn)); // здесь какая-то магия со сменой контекста
};

let Book = renameFunction("Book", function (title) {
	this.title = title;
});

let book = new Book("Cookbook");

console.log(book);


Автор примера выше лихо завернул, можно проще:
function rename(name, prop) {
	return new Function(`return function ${name} (val) {
		this.${prop} = val; // сначала писал this[${prop}], но это не работало
	}`);
}

let Test = rename("Test", "type")();
let test = new Test("js");
console.log(test); // Test {type: "js"}

Последний раз редактировалось R2R, 02.10.2018 в 19:41.
Ответить с цитированием
  #186 (permalink)  
Старый 06.01.2019, 17:16
Новичок на форуме
Отправить личное сообщение для Artem_r32 Посмотреть профиль Найти все сообщения от Artem_r32
 
Регистрация: 06.01.2019
Сообщений: 4

Привязка к <button> клавитуры hotkeys
case "w":alert('текст сообщения!');break; без проблем работает
как привязать событие на клик <button id="up">▲</button> по аналогии с нажатием мышью ?


Вот пример моего html

<!DOCTYPE html>
<html lang="ru">
	<head>
		<meta charset="utf-8">
		<title>Р РѕР±РѕС‚</title>
		<link rel="stylesheet" href="script.css">
		<script src="/jquery.js"></script>
		<script src="/script.js"></script>
	</head>
	<body>
		<div id="wrapper">
			<button id="up">▲</button>
			<button id="left">◄</button>
			<button id="right">►</button>
			<button id="down">▼</button>
		</div>
	</body>


<script src="https://unpkg.com/hotkeys-js/dist/hotkeys.min.js"></script>
<script type="text/javascript">
hotkeys('w,s,a,d', function(event,handler) {
  switch(handler.key){
    case "w":document.getElementById('up').click();break;
    case "s":document.getElementById('down').click();break;
    case "a":document.getElementById('left').click();break;
    case "d":document.getElementById('down').click();break;
  }
});
</script>


</html>



пример script.js
var robot = {
		ports: {
		up: 6,
		right: 13,
		left: 19,
		down: 26
	},
	ready: function() {
		console.log('started');
		$('#up, #right, #left, #right, #down').on({
			mousedown: robot.start,
			mouseup: robot.end
		});
	},
	start: function() {

		robot.send(this.id, 1);
	},
	end: function() {
		robot.send(this.id, 0);
	},
	send: function(port, value) {
		$.ajax({
			type: 'POST',
			url: '/GPIO/' + robot.ports[port] + '/value/' + value
		});
	}
};

$(document).ready(robot.ready);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы Gozar Сайт Javascript.ru 2 23.05.2010 01:27