Нестандартные всплывающие подсказки. Нужна конструктивная критика!
Вложений: 1
Привет всем! Я пока не очень хорошо знаю JavaScript, и поэтому прошу вас прокритиковаться от души :)
Написал код который заменяет все стандартные всплывающие подсказки на нестандартные: при наведении берется текст из атрибута title, и вставляется в блок, который тут же появляется под курсором. Вот код js:
$(document).ready(function(){
gtitle();
});
var mouseX = 0;
var mouseY = 0;
function gtitle(){
$('*').mouseover(function(){
if($(this).attr('title')){
//Из title в блок gtitle
var gtitletext = $(this).attr('title');
$('#gtitle').empty();
$('#gtitle').append(gtitletext);
$(this).removeAttr('title');//Удаляет арибут title, чтобы не вылезал стандартный title
viewGTitle();
$(this).mouseout(function(){
hideGTitle()
//Обратно из блока gtitle в title
$(this).attr('title', gtitletext);
});
}
});
$(document).mousemove(function(e){//Запоминает координаты мыши
mouseX = e.pageX;
mouseY = e.pageY;
});
}
function viewGTitle(){//функция для появления блока gtitle в правильном месте
$('#gtitle').css({
"position":"absolute",
"top":mouseY-4-$('#gtitle').height()-parseInt($('#gtitle').css("padding-top"))-parseInt($('#gtitle').css("padding-bottom")),
"left":mouseX+4
});
$('#gtitle').stop();
$('#gtitle').css("display", "block")
$('#gtitle').animate({
opacity:1
}, 400);
}
function hideGTitle(){
$('#gtitle').stop();
$('#gtitle').animate({
opacity:0
}, 400, function(){$('#gtitle').css("display", "none");});
}
Мне интересно, что бы вы сделали по другому, и как именно? |
$('*').mouseover(function()...
Тоесть навешиваем обработчики на все элементы страницы? Жесть. На этой странице их например 1200 штук. Зато при динамическом создании новых элементов они окажутся вне игры? Откройте для себя делегирование событий. $(document).mousemove - еще и постоянный обработчик mousemove ? Откройте для себя unbind. $(this).mouseout(function(){ - мы навешиваем вновь и вновь обработчик mouseout всякий раз по событию mouseover ? То есть при 100-м наведении на элемент мы получим 100 обработчиков mouseout ? Ну завели бы уже цикл for (var i=0; i < 100; i++) $(this).mouseout(fu... Еще я не вижу где создается #gtitle. И какой смысл в объявлении всех этих функций и переменных (mouseX/Y) глобально? В общем крайне убогая реализация, исправляйте перечисленные моменты, приходите вновь :) |
Спасибо, пойду дальше изучать js и совершенствовать этот код.
Как все исправлю приду за новой дозой критики :) |
Zuenf,
В принципе есть плагин .tipsy http://onehackoranother.com/projects/jquery/tipsy/ (См Gravities - Наводить на серое Перевод http://translate.google.com/translat...ed=0CDUQ7gEwAA |
Нет спасибо) Я просто решил сам попробовать сделать и поучиться заодно)
|
Вот что пока получилось.
Почитал, сделал, но косяки полюбому остались еще)
Хотелось бы узнать как много и какие)
$(document).ready(function(){
initGTitle("#gtitle");//Инициализация
});
function initGTitle(idtitle){// idtitle - id, уже созданного и оформленного в css, блока для всплывающих подсказок.
document.onmouseover = function(e) {
var event = e || window.event;
var target = event.target || event.srcElement;
var title = target.getAttribute('title');
if (!title) return;
moveTitleIntoBox(target, idtitle);//перемещение текста из title в блок для всплыв. подсказки
viewGTitle(idtitle, event.clientX,event.clientY);
target.gactive = true;//запоминаем элемент, что бы при mouseout выполнялись функции исчезновения только для него.
return false;
};
document.onmouseout = function(e) {
var event = e || window.event;
var target = event.target || event.srcElement;
if(!target.gactive) return;//Элемент не активен? выход : продолжаем
moveBoxIntoTitle(target, idtitle)
hideGTitle(idtitle);
target.gactive = false;
return false;
};
}
function viewGTitle(idtitle, x, y){
$(idtitle).css({
"position":"absolute",
"top":y-4-$(idtitle).height()-parseInt($(idtitle).css("padding-top"))-parseInt($(idtitle).css("padding-bottom")),
"left":x+4
});
$(idtitle).stop();
$(idtitle).css("display", "block")
$(idtitle).animate({
opacity:1
}, 400);
}
function hideGTitle(idtitle){
$(idtitle).stop();
$(idtitle).animate({
opacity:0
}, 400, function(){$(idtitle).css("display", "none");});
}
function moveTitleIntoBox(t, idtitle){
var gtitletext = t.getAttribute('title');
$(idtitle).empty();
$(idtitle).append(gtitletext);
t.removeAttribute('title');
}
function moveBoxIntoTitle(t, idtitle){
t.setAttribute('title', $(idtitle).html());
}
|
Цитата:
Цитата:
А если на странице так уже навешан обработчик? Будет затерт? Поломка скриптов пользователя - он нафиг выкинет твой скрипт! Цитата:
Цитата:
|
Спасибо)
Буду доделывать. |
Все сделал, но пришлось, при создании блока всплывающей подсказки, ставить z-index: 9999, это нормально или лучше по другому делать?
$(function(){
initGTitle("#gtitle");//Инициализация
});
function initGTitle(idtitle){//idtitle - id блока для всплывающих подсказок.
if(!$(idtitle).length){
$('body').append('<div id="'+idtitle.substring(1)+'"></div>');
$(idtitle).css({
"position":"absolute",
"z-index":9999
});
}
$(document).mouseover(function(e){
var event = e || window.event;
var target = event.target || event.srcElement;
if (!target.title) return;
moveTitleIntoBox(target, idtitle);//перемещение текста из title в блок для всплыв. подсказки
viewGTitle(idtitle, event.clientX,event.clientY);
$(target).data("active", true)//запоминаем элемент, что бы при mouseout выполнялись функции исчезновения только для него.
return false;
});
$(document).mouseout(function(e){
var event = e || window.event;
var target = event.target || event.srcElement;
if(!$(target).data("active")) return;//Элемент не активен? выход : продолжаем
moveBoxIntoTitle(target, idtitle);
hideGTitle(idtitle);
$(target).data("active", false);
return false;
});
}
function viewGTitle(idtitle, x, y){
$(idtitle)
.css({
"top":y-4-$(idtitle).height()-parseInt($(idtitle).css("padding-top"))-parseInt($(idtitle).css("padding-bottom")),
"left":x+4,
"display":"block"
})
.stop()
.animate({opacity:1}, 400);
}
function hideGTitle(idtitle){
$(idtitle)
.stop()
.animate({
opacity:0
}, 400, function(){$(idtitle).css("display", "none");});
}
function moveTitleIntoBox(t, idtitle){
$(idtitle)
.empty()
.append(t.title);
t.title = "";
}
function moveBoxIntoTitle(t, idtitle){
t.title = $(idtitle).html();
}
И еще вопросы: Как и куда функция data запоминает информацию? Как сделать без JQuery, чтоб мой обработчик не мешал пользовательскому? |
Цитата:
|
Цитата:
Цитата:
return false нафига тут залепил? В jQuery-обработчиках return false отменяет действие браузера по умолчанию, например переход по ссылке при клике, или прокрутка страницы при вращении колесика мыши. Для mouseover/mouseout нет действия по умолчанию.. Цитата:
Делай так при инициализации: $el = $(idtitle); и дальше уже используй $el во всем плагине |
Все это сделал, плюс немного сократил код:
$(function(){
initGTitle("#gtitle");//Инициализация
});
function initGTitle(idtitle){//idtitle - id блока для всплывающих подсказок.
if(!$(idtitle).length){
$('body').append('<div id="'+idtitle.substring(1)+'"></div>');
var el = $(idtitle);
el.css({
"position": "absolute",
"z-index": 2147483647
});
}
$(document).mouseover(function(e){
var target = e.target;
if (!target.title) return;
//перемещение текста из title в блок для всплыв. подсказки
el.empty().append(target.title);
target.title = "";
//показать подсказку
el.css({
"top":e.clientY-4-el.height()-parseInt(el.css("padding-top"))-parseInt(el.css("padding-bottom")),
"left":e.clientX+4,
"display":"block"
})
.stop()
.animate({opacity:1}, 400);
$(target).data("active", true)//запоминаем элемент, что бы при mouseout выполнялись функции исчезновения только для него.
});
$(document).mouseout(function(e){
var target = e.target;
if(!$(target).data("active")) return;//Элемент не активен? выход : продолжаем
target.title = el.html();
//скрыть подсказку
el.stop()
.animate({
opacity:0
}, 400, function(){el.css("display", "none");});
$(target).data("active", false);
});
}
И опять вопросы: Цитата:
|
Цитата:
Цитата:
|
| Часовой пояс GMT +3, время: 06:32. |