18.09.2012, 23:50
|
|
Аспирант
|
|
Регистрация: 06.07.2012
Сообщений: 31
|
|
Drag - как-то вот так решил
/js/drag.js
var dragable = function(node){
var _this = this,
_onmousemove = window.onmousemove,
_onblur = window.onblur,
_onmouseup = window.onmouseup;
if (typeof node === 'object' && node.onmousedown) {
node.onmousedown = function(e){
var e = e || window.event;
var target = e.target || e.srcElement;
target.parentNode.style.position = 'absolute';
var elementTop = target.parentNode.offsetTop,
elementLeft = target.parentNode.offsetLeft;
target.parentNode.style.top = elementTop + 'px';
target.parentNode.style.left = elementLeft + 'px';
var drag = true;
_this.addClass(target.parentNode, 'dragable');
window.onblur = window.onmouseup = function(){
drag = false;
_this.removeClass(target.parentNode, 'dragable');
window.onmousemove = _onmousemove;
window.onblur = _onblur;
window.onmouseup = _onmouseup;
};
window.onmousemove = function(_e){
if (drag){
var _e = _e || window.event;
target.parentNode.style.top = _e.clientY - e.clientY + elementTop + 'px';
target.parentNode.style.left = _e.clientX - e.clientX + elementLeft + 'px';
}
}
}
}
}
dragable.prototype = {
addClass : function(node, name){
if (typeof node === 'object' && typeof node.setAttribute === 'function' && name){
var stack = node.getAttribute('class') ? node.getAttribute('class').split(' ') : [];
for (var i in stack)
if (stack[i] === name)
return true;
stack.push(name);
node.setAttribute('class', stack.join(' '));
return true;
}
return false;
},
removeClass : function(node, name){
if (typeof node === 'object' && typeof node.setAttribute === 'function' && name){
var stack = node.getAttribute('class') ? node.getAttribute('class').split(' ') : [];
for (var i in stack)
if (stack[i] === name)
delete stack[i];
node.setAttribute('class', stack.join(' '));
return true;
}
return false;
}
};
window.onload = function(){
new dragable(document.getElementById('drag'));
}
html
<!DOCTYPE html>
<html>
<head>
<title>Drag</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="/js/drag.js"></script>
<style>
html, body { height: 100%; margin: 0; padding: 0; }
#drag { padding: 30px 0; width: 300px; text-align: center; display: block; border: 1px solid #CCCCCC; background: #EEEEEE; }
</style>
</head>
<body>
<div>
<div id="drag">Возьми и перетащи меня!!!</div>
</div>
</body>
</html>
Покритикуйте
Ps: теперь с учетом замечаний Dim@
(не проверял)
Последний раз редактировалось shkoder, 19.09.2012 в 07:41.
|
|
19.09.2012, 00:24
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
shkoder,
как минимум не кроссбраузерно, куда ни глянь - сплошные таргеты -
if (typeof node === 'object' && typeof node.onmousedown === 'object') {
node.onmousedown = function(e){
e.target.parentNode.style.position = 'absolute';
var elementTop = e.target.parentNode.offsetTop,
elementLeft = e.target.parentNode.offsetLeft;
они поддерживаются основными браузерами, для ИЕ же надо надо писать
var e = e || window.event;
var target = e.target || e.srcElement;
ну а с практической точки зрения пока не рассматривал - опиши, что нужно делать?
|
|
19.09.2012, 00:27
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
shkoder,
плюс
Цитата:
|
typeof node.onmousedown === 'object'
|
не совсем правильно:
var obj = {};
var fun = function () {};
alert(["obj " + typeof obj, "fun " + typeof fun].join("\n"));
|
|
19.09.2012, 07:34
|
|
Аспирант
|
|
Регистрация: 06.07.2012
Сообщений: 31
|
|
Сообщение от Dim@
|
shkoder,
плюс
typeof node.onmousedown === 'object'
не совсем правильно:
|
Dim@,
вы правы, спасибо.
По поводу ie - его у меня нету, проверить не на чем, а под wine его запускать как-то не очень. Но учту учту.
|
|
19.09.2012, 14:00
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
shkoder,
Создай тестовую страницу, чтобы можно было перейти и посмотреть работу по клику. Либо [HTML RUN], а то лень копирастией заниматься.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.09.2012, 14:10
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Ещё, сразу вопрос. Почему это всё вешается на элемент вставленный в страницу?
Лично мне идея делать уже вставленный в страницу элемент Dragable видится абсолютно бесполезной. Гораздо удобней создавать элемент динамически и вставлять в страницу, а так же делать его удаляемым, по крестику справа.
В остальном задача двигать элемент на странице - задача довольно простая. Так что критиковать код я пожалуй не буду, т.к. для меня он не применим к жизни.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.09.2012, 14:16
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
И ещё мне не нравиться, что идет привязка элемента по id, вернее то, что я сам должен назначать ему этот самый id, а не так:
new dragable({title:"Новое окошко", content: "<h1>Опа</h1> Ну и так далее текст"});
или так:
new dragable({title:"Новое окошко", content: "<h1>Опа</h1> Ну и так далее текст", parent: document.body});
Как будут вести себя элементы, когда их будет несколько? Как будет визуально отражаться вид элемента в зависимости от того, какой элемент сейчас сверху?
А в остальном, если код рабочий, то критика не нужна. Но нужно думать о том, чтобы код можно было расширить, без потери читабельности и его адекватности(когда теряется всякое строение и лепятся кучи заглушек, так что код проще переписать, нежели расширять).
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 19.09.2012 в 14:22.
|
|
20.09.2012, 00:20
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
shkoder, критиковать очередной фабричный велосипед?
0. толку от сохранения обработчиков в текущий экзампляр, если в конструкторе образуется замыкание?
1. элемент должен appendChild'иться к body, не изменяя своего положения.
2. вместо изменения top\left лучше было бы изменять transform:translate(X,Y)
3. нужно ограничить частоту отрисовки до 24-х раз в секунду.
Последний раз редактировалось melky, 20.09.2012 в 18:21.
|
|
20.09.2012, 10:59
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от melky
|
вместо изменения top\left нужно изменять transform:translate(X,Y)
|
Почему именно нужно, а не можно?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
20.09.2012, 18:21
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Gozar
|
Почему именно нужно, а не можно?
|
поправил. это как способ улучшения.
|
|
|
|