Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.02.2013, 03:36
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 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");});
}

Мне интересно, что бы вы сделали по другому, и как именно?
Изображения:
Тип файла: jpg gtitle.jpg (33.1 Кб, 33 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 16.02.2013, 11:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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) глобально? В общем крайне убогая реализация, исправляйте перечисленные моменты, приходите вновь
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2013, 21:03
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Спасибо, пойду дальше изучать js и совершенствовать этот код.
Как все исправлю приду за новой дозой критики
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2013, 21:42
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Zuenf,
В принципе есть плагин .tipsy http://onehackoranother.com/projects/jquery/tipsy/
(См Gravities - Наводить на серое


Перевод
http://translate.google.com/translat...ed=0CDUQ7gEwAA
Ответить с цитированием
  #5 (permalink)  
Старый 17.02.2013, 23:48
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Нет спасибо) Я просто решил сам попробовать сделать и поучиться заодно)
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2013, 02:03
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2013, 03:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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')
Ответить с цитированием
  #8 (permalink)  
Старый 03.03.2013, 18:34
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Спасибо)
Буду доделывать.
Ответить с цитированием
  #9 (permalink)  
Старый 10.03.2013, 01:03
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 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 (permalink)  
Старый 10.03.2013, 01:20
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Zuenf
ставить z-index: 9999, это нормально или лучше по другому делать?
В принципе в Инет реализациях z-index идет в обязательном порядке, хотя типично её закидывают в конец body, где она и так превышает любой не установленный z-index любого элемента, но не факт, что кто-то его не использует
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна критика идеи! rom4ik Ваши сайты и скрипты 32 27.04.2010 16:36
Всплывающие подсказки в IE arseniy-at-home Элементы интерфейса 8 27.07.2009 16:13