Оцените пожалуйста код.
Здравствуйте, уважаемые.
Недавно начал изучать 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... |
var element = this.element; В чём профит от этой переменной? Я бы понял если бы она использовалась в каком нибудь колбэке (т.е. чтобы в правильном контексте) или путь был бы слишком длинный (this.element.element2.element3.element4). А тут то зачем? Не существенно конечно, но лично меня это раздражает в коде. p.s.: смотрел только с 62 по 68 строку. |
newbie7,
хороший, понятный код! Только выделяйте блоки с переменными и функции переносом строки, а то иногда кашеца получается) Цитата:
Цитата:
|
Цитата:
1 coords = this.getBoundingClientRect() вычислять нужно 1 раз при заходе на элемент , а не всякий раз при движении мыши -данные статичны при всяком вычислении. 2 3 при каждом мове не стоит "перерисовывать" лупу . Оптимальная частота 30 -60 кадров в секунду . События движения мыши вызовутся гораздо в большем количестве чем эта частота , и при соответствующих условиях будет явно виден эффект торможения. Цитата:
|
l-liava-l,
по объёму кода не больше будет. минус одна лишняя строчка. я бы понял если бы он "e" вместо "element " написал. а так заменили: this.element на my_mega_element чем лучше то? точки нет? p.s.: 4 раза |
Цитата:
|
el. e на объект события похоже. я по крайней мере так его всегда именую
|
вообще если понятность не очень страдает то я экономлю место по вертикали и не создаю переменные которые используются 1, 2 раза. лучше чтобы код по вертикали был компактнее.
if(!(this instanceof Imgt)) {
return new Imgt(id);
}
this.element = document.getElementById(id);
тут явно строка пустая не нужна например. сверху от условия да, чтобы не сливалось можно пропустить. из-за таких лишних строк кроме одной ф-й ни чего на экране не видно, не видно как она связана с другим кодом. p.s.: хз, многим покажется мелочью и мб они будут правы, но мне глаз режет как то это всё последнее время. p.s.s: документационные комментарии все мои усилия сводят на нет |
Спасибо всем, кто откликнулся.
Цитата:
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)});
}
};
По второму пункту мне не совсем понятно. Пробовал исправлять и виджет просто перестаёт работать. А с третьим так и вовсе тьма :help: По идее нужно замедлить сам обработчик события mousemove, чтобы не так часто выполнялась функция Imgt.shower, но как это сделать пока не знаю. Цитата:
Копипаста здесь нет. Я как и, наверно, любой другой новичок хотел найти на форумах кого-нибудь вроде куратора, но прочитав не одну такую тему понял что бесполезно. И решил попробовать просто выложить код на обсуждение. И до гения мне как до луны, потому как после некоторых тем просто мозги наружу :cray: |
пункт 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/ некоторые его высказывания можно назвать спорными, но мозги в нужную строну поворачивает. Примеры там есть . А в обще, довольно странно, как вы всё смешали . Создаёте объекты, а обращаетесь к методам и свойствам функции из него переназначая их всякий раз при создании. А не к методам и свойствам объекта .... Подводя итог: читаемость -да форматирование -да архитектура -нет говнокод -да базовые оптимизации -нет читаемость и форматирование ничто в сравнении с неправильной архитектурой и говнокодом. Оптимизации не беру в расчёт Склоняюсь к жесткому копипасту -копирование правильных участков кода из литературы , без понимания архитектуры , взаимодействий и базовых знаний о том , что и как работает А вобще всё не так бы делал. собрал бы всё в модуль накинул бы наблюдатель ,и при заходе на изображение помеченное, классом , атрибутом ... включал бы лупу а не создавал бы явно для каждого изображения объект |
| Часовой пояс GMT +3, время: 21:02. |