16.02.2013, 03:36
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Нестандартные всплывающие подсказки. Нужна конструктивная критика!
Привет всем! Я пока не очень хорошо знаю 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");});
}
Мне интересно, что бы вы сделали по другому, и как именно?
|
|
16.02.2013, 11:04
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
$('*').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) глобально? В общем крайне убогая реализация, исправляйте перечисленные моменты, приходите вновь
|
|
16.02.2013, 21:03
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Спасибо, пойду дальше изучать js и совершенствовать этот код.
Как все исправлю приду за новой дозой критики
|
|
16.02.2013, 21:42
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
|
|
17.02.2013, 23:48
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Нет спасибо) Я просто решил сам попробовать сделать и поучиться заодно)
|
|
03.03.2013, 02:03
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Вот что пока получилось.
Почитал, сделал, но косяки полюбому остались еще)
Хотелось бы узнать как много и какие)
$(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());
}
Последний раз редактировалось Zuenf, 03.03.2013 в 11:32.
|
|
03.03.2013, 03:28
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Zuenf
|
initGTitle("#gtitle")
|
Думаю хреновая идея. Нафига юзеру создавать элемент вручную? Это должен делать скрипт!
Сообщение от Zuenf
|
document.onmouseover
|
Забыл что пишешь "плагин jQuery" ?
А если на странице так уже навешан обработчик? Будет затерт? Поломка скриптов пользователя - он нафиг выкинет твой скрипт!
Сообщение от Zuenf
|
var title = target.getAttribute('title');
|
Нафига все делается через атрибуты? Нужно использовать свойства, а не атрибуты: var title = target.title;
Сообщение от Zuenf
|
target.gactive = true
|
Не стоит засерать DOM-элементы своими свойствами. Это абсолютно ни к чему. Тем более в jQuery есть удобная система $(el).data('key', 'value')
|
|
03.03.2013, 18:34
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Спасибо)
Буду доделывать.
|
|
10.03.2013, 01:03
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Все сделал, но пришлось, при создании блока всплывающей подсказки, ставить 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, чтоб мой обработчик не мешал пользовательскому?
|
|
10.03.2013, 01:20
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Zuenf
|
ставить z-index: 9999, это нормально или лучше по другому делать?
|
В принципе в Инет реализациях z-index идет в обязательном порядке, хотя типично её закидывают в конец body, где она и так превышает любой не установленный z-index любого элемента, но не факт, что кто-то его не использует
|
|
|
|