Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   UpJump: Q&A :) (https://javascript.ru/forum/misc/14421-upjump-q.html)

Aetae 19.04.2011 01:40

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

FINoM 20.04.2011 02:16

Может вопрос и тупой, но можно ли как-то получить набор видимых, объявленных в коде переменных и, возможно, функций? Например,
(function(){
var x = 5, y = 10;
console.log(__variables__); // Объект {x:3, y:10}
})()

Matre 20.04.2011 06:00

FINoM, нормальными средствами — никак. Потребуется либо разбирать код скриптом, чтобы достать объявления переменных, либо писать что-то вроде этого:

Function.prototype.scope = function () {
	var script = this.toString().replace(/function ?.*\([^)]*\)(?:\n|\s|\t)\{/, "").replace(/\}(?:\n|\t|\s)*$/, "").replace(/var +([а-яa-z0-9]+)/gi, "scope.$1");
	var scope = {};
	scope.scope = {};
	with (scope)
		eval(script);
	return scope.scope;
};


var x = function () {
	var p = 123;
};

alert(x.scope().p);


Давно писал. Можно заточить под свои нужды.

UpJump 22.04.2011 00:04

Всем снова привет! Народ где я застрял? в чем ошибка?
Почему count не увеличивается?

var count =0;
whatRol(count);

function whatRol(c){
		var int = window.setTimeout(rol,2);
		function rol(){
			c++;
			alert(count)
		}
	}


Как я понимаю я не передаю аргумент в функцию. Но почему?

poorking 22.04.2011 00:15

Передаешь, ты наверно просто ожидаешь что он передался по ссылке, но примитивные значения передаются по значению.

Aetae 22.04.2011 00:18

Если по простому, то увеличивается внутренняя переменная c, которой при вызове присваивается значение переменной count, а не сама count.

UpJump 22.04.2011 00:20

мдя. ясно. надо повтыкать эту тему. про это я не подумал. спасибо всем

FINoM 22.04.2011 02:05

Очень был удивлен возможностью создавать константы в хроме
const X = 5; 
X = 10;
alert(X);
Какие еще браузеры их поддерживают?

Matre 22.04.2011 04:53

http://javascript.ru/blog/Octane/Fun...nty-JavaScript

UpJump 22.04.2011 22:16

всегда ли функции запускаются в том порядке в каком их вызываешь?

B@rmaley.e><e 22.04.2011 22:17

Да.

UpJump 23.04.2011 01:12

Хорошо, а при нескольких setInterval() их итерации могут запускаться не последовательно? Например:
var int1 = setInterva(f1,1)
var int2 = setInterval(f2,1)
var int3 = setInterval(f3,1)

К примеру итерация из int3 обогнать int1 или int2?

B@rmaley.e><e 23.04.2011 08:41

Да.

UpJump 23.04.2011 22:52

спс

UpJump 25.04.2011 15:32

всем привет. при использовании setInterval() в разных браузерах минимальный интервал разный:
Firefox и Safari в среднем 11мс
Opera — 2 мс
Chrome — 4 мс
IE — 15 мс.

С помошью postMessage можно существенно сократить время для всех браузеров кроме IE. вот статья кому интересно. Вопрос в следующем. Есть ли какой-нибудь способ сократить время в IE?

UPD
Если есть ссылки на топик по данному сабжу буду признателен

Aetae 26.04.2011 01:26

Зачем?

FINoM 26.04.2011 01:46

Можно ли сделать объект-константу либо свойство-константу?

B@rmaley.e><e 26.04.2011 07:15

FINoM, в ES5 есть Object.seal и Object.freeze, но они еще не везде реализованы. Константное "свойство" можно реализовать, используя методы, возвращающие копию значения.

UpJump 26.04.2011 12:32

Aetae, для быстрой и одновременно плавной анимации.

poorking 26.04.2011 13:19

UpJump,
Мне кажется это будет зависеть больше не от этого времени, а от того, сколько стилей вы будете менять за 1 кадр, так как это очень медленная операция, так что оптимизировать нужно именно там, при возможности менять классы, а не значения свойств стилей. А скорости вполне хватить должно.
<!DOCTYPE html>
<meta charset = "utf-8" />
<script type = "text/javascript">


window.onload = function(){
	var stranger = document.getElementById("stranger"), A = 250, STEP = 1;
	
	var top, left, c = 0;
	(function(){
		c %= 360;
		
		top = A + A * Math.sin((c ++)/180 * Math.PI);
		left = A + A * Math.cos((c ++)/180 * Math.PI);
		
		stranger.style.top = top + "px";
		stranger.style.left = left + "px";
		
		window.setTimeout(arguments.callee, STEP);
	}())
}
</script>
<style type = "text/css">
	#stranger{
		position:absolute;
		border: red solid thick;
		background-color: green;
		width: 50px;
		height: 50px;
	}
</style>

<div id = "stranger"></div>

в ie9 летает быстрее чем в FF и даже быстрее чем в хроме, правда открыто много вкладок.

И еще, лично я считаю, что лучше пожертвовать плавностью в анимации перед загруженностью процессора, если вы раз в миллисекунду будете менять штук 10 стилей элемента, и если таких элементов будет несколько например (вдруг игра какая нибудь), то тормозов не избежать, лучше уж делать шаг перемещения побольше, чем супер короткие кадры. К тому же если анимация быстрая, то не заметно все равно.
Это конечно относится только к длительным постоянным анимациям, а не всплывашкам/менюшкам/выезжашкам

poorking 26.04.2011 17:40

Задам вопрос здесь, чтобы не плодить темы.

Писал функционал для создания ДОМ узлов, поудобнее страндартного, на его основе. И возвращает он documentFragment, так как есть возможность за раз вернуть несколько элементов в него запакованных. Но нужна была возможность преобразовывать DOM Элемент в хтмл и я сначала сделал так

//корневой элемент, который я буду возвращать
chest = document.createDocumentFragment();
//создаем тут все дерево в зависимости от параметров
//***************

//в конце
chest.html = function(){
 var div = document.createElement("DIV");
 div.appendChild(this);
 return div.innerHTML;

}
return chest;


Но по вставке фрагмента в узел, он исчезает. Вопрос в том, куда девается метод html() ? Удаляется garbage collector -ом?

Пока я этого не понял я еще так попробовал
Object.prototype.html = function(){
	if(!this.nodeType){
		return "";
	}
	
	var div = document.createElement("DIV");
	div.appendChild(this);
	
	return div.innerHTML;
}


Проверил на html элементах, работает нормально. Не стал проверять nodeType == 1 или 3, вдруг коммент захочется создать (8) или еще чего (не знаю зачем, просто интересно). Любую ли nodeType можно appendChild ?
И как как правильнее проверить Object что это XML node? (Жалко что нет прототипа у хтмл элементов в IE)

Aetae 26.04.2011 21:34

Цитата:

Сообщение от UpJump (Сообщение 102164)
Aetae, для быстрой и одновременно плавной анимации.

Вообще-то человеческий глаз воспринимает 24 кадра в секунду, те интервал менее ~41мс не нужен. На самом деле и 100мс более чем достаточно в большинстве случаев.

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

UpJump 27.04.2011 14:35

огромное спасибо poorking и Aetae.

теперь понял где загвостку искуть.:thanks:

x-yuri 27.04.2011 22:56

poorking, используй строки (String.format, String.compile например). Во-первых, будет понятно, что ты за разметку генерируешь, а во-вторых, скорее всего будет быстрее, чем работа с DOM

по поводу DocumentFragment... метод html никуда не исчезает, просто appendChild(documentFragment) - это appendChild всех его детей. А как мы знаем, appendChild удаляет элементы из контейнера, в котором они до этого были

Цитата:

Сообщение от poorking
Любую ли nodeType можно appendChild ?

попробуй

Цитата:

Сообщение от poorking
И как как правильнее проверить Object что это XML node?

зачем? И что ты с ними делать собираешься?

FINoM 26.05.2011 05:23

Снова, чтоб не засорять форум, спрашиваю здесь.
Почему первый вариант вызывает ошибку, второй возвращает 4, третий работает корректно (получаем объект, указанный в скобках)?
eval('{a:4, b:6}'); //Unexpected token :
eval('{a:4}'); //4
eval('({a:4, b:6})'); //объект {a:4, b:6}

Проверялось только в хроме.

Kolyaj 26.05.2011 12:04

Цитата:

Сообщение от FINoM
{a:4, b:6}

Здесь фигурные скобки не находятся внутри выражения, поэтому рассматриваются как блок. a: рассматривается как метка, 4 -- выражение. А вот после запятой метки быть не может, поэтому ошибка.

Цитата:

Сообщение от FINoM
второй возвращает 4

Из объяснения выше убираем про ошибку.

Цитата:

Сообщение от FINoM
({a:4, b:6})

Здесь уже фигурные скобки находятся внутри выражения, поэтому рассматриваются как объект.

Для подробностей читать грамматику языка :)

UpJump 05.07.2011 17:29

Всем привет! Братья прошу помощи.

function f(a){
var a = a*(2*Math.PI/360);
var z = (2*(-Math.sin(a))+2*(Math.cos(a)));
alert(z);
}
f(45);


Почему результат не ноль. Даже не близко. Может кто углядит потому как глаз уже замылился.

Sweet 05.07.2011 17:44

Цитата:

Сообщение от UpJump
Даже не близко

Почему же. Очень даже близко: 2.220446049250313e-16

UpJump 05.07.2011 18:27

а ну да... понял. если округлить то да.
Math.cell(z);

UpJump 09.07.2011 20:36

Всем привет! Вот такой мелкий скрипт:
<div id = 'd'></div>

<script>

function clear(div_id){
	for(var i =0; i<document.getElementById(div_id).childNodes.length; i++)
			document.getElementById(div_id).removeChild(document.getElementById(div_id).childNodes[i]);
}

function f(){
	clear('d');
	var c = document.createElement('canvas');
	var div = document.getElementById('d');
	div.appendChild(c);
}

window.setInterval(f,1);

</script>

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

P.S.
Это попытка написать примитивный движок на базе js + canvas если кому интересно. Код упрощен до проблемной зоны.
Тестировал на Chrome и IE.

UpJump 11.07.2011 17:01

народ а есть способ очистить canvas? Просто удалить canvas не подходит.
к примеру что бы с каждой итерацией обновлять составляющее канваса.

Kolyaj 11.07.2011 17:03

Изменить размеры, например.

UpJump 11.07.2011 17:06

нет тут дело в том что бы анимировать векторный элемент в канвасе

UPD
к примеру в css + javascript дает возможность анимировать простой див. в канвасе такого нет

Kolyaj 11.07.2011 17:11

Конечно, это же растровая графика, а не векторная.

UpJump 11.07.2011 17:17

короче как я понял без вариантов? тупо удалять и создавать новый канвас

Kolyaj 11.07.2011 17:41

Нарисовать прямоугольник на весь canvas нужного цвета.

UpJump 11.07.2011 20:37

по вашей идеи залез в пыльный справочник ... и clearRect();
все гениальное просто.

спасибо за идею!

UpJump 13.07.2011 02:01

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

UpJump 14.07.2011 20:00

на какие версии распространяется определение IE таким образом?
document.all ? alert('IE!') : alert('Not IE!');

Хотя бы сработает на IE6?

trikadin 14.07.2011 20:22

У меня восьмой. Действует. А вообще, самый короткий способ определить ie, который я знаю - это такой:
alert('\v'=='v' ? "IE!" : "Not IE!");


Нашёл где-то...


Часовой пояс GMT +3, время: 10:23.