Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.03.2013, 10:59
Аватар для newbie7
Новичок на форуме
Отправить личное сообщение для newbie7 Посмотреть профиль Найти все сообщения от newbie7
 
Регистрация: 15.10.2012
Сообщений: 5

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

p.s. В одной из тем нашёл ссылку на jquery плагин (http://chrisiufer.com/loupe/), который советовали сделать на обычном JS. У меня как-бы получилось, но оценить качество кода возможности не имею. На CSS неточности просьба не обращать внимание, интересует только оценка реализации на JS.


<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>Прикольный виджет</title>
	<style type="text/css">
		.lupe {
			border: gray 4px solid;
			width: 200px;
			height: 200px;
			position: absolute;
			background-repeat: no-repeat;
			background-color: white;
			border-radius: 200px;
		}
	</style>
</head>
<body>
	<img id="image" src="http://4.bp.blogspot.com/-PaPJ6ulqi9c/Tf1-QMenB1I/AAAAAAAAADs/U_31Ap2LIjA/s1600/novye-interesnye-fotografii-ot-national-geographic-4.jpg" alt="" width="400">
	<img id="image2" src="http://2.bp.blogspot.com/-Edrn-TiDZlw/UPha3ogDR1I/AAAAAAAAA9s/esDb0tWcCdA/s1600/DSC06442.JPG" alt="" width="400">

	<script type="text/javascript">
		var Imgt = function (id) {

			if(!(this instanceof Imgt)) {
				return new Imgt(id);
			}

			this.element = document.getElementById(id);

			this.addEvent('mouseover', Imgt.createLupe);
			this.addEvent('mouseout', Imgt.deleteLupe);
			this.addEvent('mousemove', Imgt.shower);
		};

		Imgt.lupe = document.createElement('div');
		Imgt.createLupe = function () {
			var lupe = Imgt.lupe;
			lupe.className = 'lupe';
			document.getElementsByTagName('body')[0].appendChild(lupe);
			lupe.style.backgroundImage = 'url('+ this.src + ')';
		};
		Imgt.deleteLupe = function () {
			var lupe = Imgt.lupe;
			lupe.parentNode.removeChild(lupe);
		};
		Imgt.shower = function (e) {
			var lupe = Imgt.lupe,
				event = e || window.event,
				eX = event.x || event.clientX,
				eY = event.y || event.clientY,
				coords = this.getBoundingClientRect(),
				y = -(eY - coords.top)*4+100  + 'px',
				x = -(eX - coords.left)*4+100 + 'px';

			lupe.style.top = 10 + eY + 'px';
			lupe.style.left = 10 + eX + 'px';
			lupe.style.backgroundPosition = x + ' ' + y;
		};


		Imgt.prototype.addEvent = function (event, handler) {
			var element = this.element;
			if(element.addEventListener) {
				return element.addEventListener(event, handler);
			}else if(element.attachEvent) {
				return element.attachEvent('on' + event, handler);
			}
		};



		var i = new Imgt('image');
		var i2 = Imgt('image2');


	</script>
</body>
</html>


Буду также признателен за советы из области как отрастить скил в JS...
Ответить с цитированием
  #2 (permalink)  
Старый 10.03.2013, 13:04
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

var element = this.element;

В чём профит от этой переменной?

Я бы понял если бы она использовалась в каком нибудь колбэке (т.е. чтобы в правильном контексте) или путь был бы слишком длинный (this.element.element2.element3.element4). А тут то зачем? Не существенно конечно, но лично меня это раздражает в коде.


p.s.: смотрел только с 62 по 68 строку.
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)

Последний раз редактировалось Tim, 10.03.2013 в 13:08.
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2013, 12:05
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

newbie7,
хороший, понятный код! Только выделяйте блоки с переменными и функции переносом строки, а то иногда кашеца получается)

Цитата:
var element = this.element;
В чём профит от этой переменной?
в понятности и сокращении кода, ему что там this.element 5 раз писать?)

Цитата:
Буду также признателен за советы из области как отрастить скил в JS...
Просто побольше пиши, я вот уже неделю не пишу и чувствую что деградирую, хотя и без того балбес)
__________________
Научу себя плохому

Последний раз редактировалось l-liava-l, 12.03.2013 в 12:08.
Ответить с цитированием
  #4 (permalink)  
Старый 12.03.2013, 13:05
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от newbie7
Imgt.shower = function (e) {
var lupe = Imgt.lupe,
event = e || window.event,
eX = event.x || event.clientX,
eY = event.y || event.clientY,
coords = this.getBoundingClientRect(),
y = -(eY - coords.top)*4+100 + 'px',
x = -(eX - coords.left)*4+100 + 'px';

lupe.style.top = 10 + eY + 'px';
lupe.style.left = 10 + eX + 'px';
lupe.style.backgroundPosition = x + ' ' + y;
};
Ужасный участок .
1 coords = this.getBoundingClientRect() вычислять нужно 1 раз при заходе на элемент , а не всякий раз при движении мыши -данные статичны при всяком вычислении.
2 (eY - coords.top)*4+100 (eY - coords.top)*400
3 при каждом мове не стоит "перерисовывать" лупу . Оптимальная частота 30 -60 кадров в секунду . События движения мыши вызовутся гораздо в большем количестве чем эта частота , и при соответствующих условиях будет явно виден эффект торможения.

Сообщение от newbie7
Недавно начал изучать JS. В программировании опыта нет совершенно
и конструкторы и прототипы и Dom + фишки Либо практически чистый копипаст, либо гений ,либо автор топика лукавит

Последний раз редактировалось dmitriymar, 12.03.2013 в 13:08.
Ответить с цитированием
  #5 (permalink)  
Старый 12.03.2013, 13:29
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

l-liava-l,
по объёму кода не больше будет. минус одна лишняя строчка. я бы понял если бы он "e" вместо "element " написал.
а так заменили:
this.element
на
my_mega_element
чем лучше то? точки нет?

p.s.: 4 раза
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2013, 14:27
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

Цитата:
по объёму кода не больше будет. минус одна лишняя строчка. я бы понял если бы он "e" вместо "element " написал.
а так заменили:
this.element
на
my_mega_element
чем лучше то? точки нет?

p.s.: 4 раза
угу, лучше бы e или el
__________________
Научу себя плохому
Ответить с цитированием
  #7 (permalink)  
Старый 12.03.2013, 14:51
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

el. e на объект события похоже. я по крайней мере так его всегда именую
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #8 (permalink)  
Старый 12.03.2013, 14:58
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

вообще если понятность не очень страдает то я экономлю место по вертикали и не создаю переменные которые используются 1, 2 раза. лучше чтобы код по вертикали был компактнее.

if(!(this instanceof Imgt)) {
    return new Imgt(id);
}
 
this.element = document.getElementById(id);


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

p.s.: хз, многим покажется мелочью и мб они будут правы, но мне глаз режет как то это всё последнее время.

p.s.s: документационные комментарии все мои усилия сводят на нет
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #9 (permalink)  
Старый 12.03.2013, 23:22
Аватар для newbie7
Новичок на форуме
Отправить личное сообщение для newbie7 Посмотреть профиль Найти все сообщения от newbie7
 
Регистрация: 15.10.2012
Сообщений: 5

Спасибо всем, кто откликнулся.
Сообщение от dmitriymar
Ужасный участок .
1 coords = this.getBoundingClientRect() вычислять нужно 1 раз при заходе на элемент , а не всякий раз при движении мыши -данные статичны при всяком вычислении.
2 (eY - coords.top)*4+100 (eY - coords.top)*400
3 при каждом мове не стоит "перерисовывать" лупу . Оптимальная частота 30 -60 кадров в секунду . События движения мыши вызовутся гораздо в большем количестве чем эта частота , и при соответствующих условиях будет явно виден эффект торможения.
Первый пункт исправил. Сам объект coords поместил в конструктор.
Imgt.shower = function (e,obj) {
			var lupe = Imgt.lupe,
				event = e || window.event,
				eX = event.x || event.clientX,
				eY = event.y || event.clientY,
				y = -(eY - obj.coords.top)*4+100 + 'px',
				x = -(eX - obj.coords.left)*4+100 + 'px';

			lupe.style.top = 10 + eY + 'px';
			lupe.style.left = 10 + eX + 'px';
			lupe.style.backgroundPosition = x + ' ' + y;
		};

		Imgt.prototype.addEvent = function (event, handler) {
			var self = this;
			if(this.element.addEventListener) {
				return this.element.addEventListener(event, function(e) {handler(e,self)});
			}else if(this.element.attachEvent) {
				return this.element.attachEvent('on' + event, function(e) {handler(e,self)});
			}
		};

По второму пункту мне не совсем понятно. Пробовал исправлять и виджет просто перестаёт работать.
А с третьим так и вовсе тьма По идее нужно замедлить сам обработчик события mousemove, чтобы не так часто выполнялась функция Imgt.shower, но как это сделать пока не знаю.

Сообщение от dmitriymar
и конструкторы и прототипы и Dom + фишки Либо практически чистый копипаст, либо гений ,либо автор топика лукавит
В JS начал разбираться примерно в октябре 2012, но после того как чуть с ума не сошёл от рекурсии в функции вычисления факториала закинул. Вторая попытка началась с середины декабря, когда пришла книга Флэнэгана и пока продолжается (надеюсь и не закончится ). Возможно для опытного программиста, которому достаточно спецификацию прочитать, это и вечность, но для меня, с дипломом инженера-гидротехника, это недавно.
Копипаста здесь нет. Я как и, наверно, любой другой новичок хотел найти на форумах кого-нибудь вроде куратора, но прочитав не одну такую тему понял что бесполезно. И решил попробовать просто выложить код на обсуждение.
И до гения мне как до луны, потому как после некоторых тем просто мозги наружу
Ответить с цитированием
  #10 (permalink)  
Старый 13.03.2013, 00:11
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

пункт 2 .
я загнал -не глянул на очерёдность вычислений в коде.
в любом случае там можно оптимизировать . Раскройте скобки -сведите всё к двум операциям. Здесь конечно прирост будет не заметен , но на сложных вычислениях результат будет заметен
eY *4 и eX*4 -по сути дела изменяемые величины. требующие вычисления всё остальное в выражениях константы :

obj.coords.top*4+100,
obj.coords.left*4+100

да и obj -можно сделать закрытым свойством и обращаться к нему (либо просто свойством), а не предавать в обработчик лишним аргументом



пункт 3 http://www.ozon.ru/context/detail/id/19106391/
некоторые его высказывания можно назвать спорными, но мозги в нужную строну поворачивает. Примеры там есть .

А в обще, довольно странно, как вы всё смешали .
Создаёте объекты, а обращаетесь к методам и свойствам функции из него переназначая их всякий раз при создании. А не к методам и свойствам объекта ....

Подводя итог: читаемость -да
форматирование -да
архитектура -нет
говнокод -да
базовые оптимизации -нет

читаемость и форматирование ничто в сравнении с неправильной архитектурой и говнокодом. Оптимизации не беру в расчёт

Склоняюсь к жесткому копипасту -копирование правильных участков кода из литературы , без понимания архитектуры , взаимодействий и базовых знаний о том , что и как работает

А вобще всё не так бы делал.
собрал бы всё в модуль
накинул бы наблюдатель ,и при заходе на изображение помеченное, классом , атрибутом ... включал бы лупу
а не создавал бы явно для каждого изображения объект

Последний раз редактировалось dmitriymar, 13.03.2013 в 12:14.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Введенный код в prompt() falsenull Общие вопросы Javascript 8 21.05.2012 16:47
помогите пожалуйста улучшить код. Duda.Ml1986@gmail.com Серверные языки и технологии 4 07.01.2012 20:53
Типографика и HTML код Manjuriano (X)HTML/CSS 3 23.11.2011 12:22
Пожалуйста, объясните что мне сделать с этим... someLogin Events/DOM/Window 2 16.10.2011 22:47
Почему не работатет код?! WitaliG Ваши сайты и скрипты 5 17.08.2010 09:30