Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10

Как правильно различить объекты

28.01.2013, 20:41. Показов 1528. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане возникла у меня такая проблема - есть два элемента :
HTML5
1
2
<a class='class1' href="#">SomeText</a>
<a class='class1' href="#"><em>SomeText</em></a>
Мне нужно сделать следующие - вызвать событие при наведении на первую ссылку, без тега em, но чтобы это событие не работало при наведении на вторую - с тегом em. Как вызвать событие я знаю, а вот с разделением беда...
Если быть точнее, то подскажите пожалуйста каким образом в скрипте можно разграничить эти две ссылки, с учетом того что класс у них одинаков, т.е. по присутствию этого самого тега em?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2013, 20:41
Ответы с готовыми решениями:

Как правильно создавать объекты ?
Как правильно создавать объекты и как они расходуют память, что является правильным подходом? вариант 1: public class...

Как правильно сравнивать объекты?
Есть такой код поиска public ActionResult PhoneDirectory(string nameText, string surnameText) { ...

Как правильно объединить объекты?
Не знал как назвать тему, чтобы раскрыть всю суть вопроса. А она такова. Есть у меня массив с обьектами который я получаю в результате...

16
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
29.01.2013, 06:53
JavaScript
1
2
3
$('.class1').first().mouseover(function(){
    alert($(this).text());
});
1
 Аватар для Soldado
901 / 833 / 198
Регистрация: 28.06.2012
Сообщений: 1,607
Записей в блоге: 4
29.01.2013, 11:58
Если решать задачу буквально, т.е. исключить элементы с классом .class1 содержащие в себе теги em, то:
JavaScript
1
2
3
$('.class1').not($('.class1 em').parent()).mouseover(function(){
    alert($(this).text());
});
1
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10
29.01.2013, 13:42  [ТС]
Спасибо народ, что откликнулись.
Dolphin тема такая, что таких ссылок и с тегом и без на одной странице может быть много.
В общем для полноты картины вот вся моя идея и коды. Творю я себе подсказку всплывающую (я знаю что есть уже много, но хочется самому попробовать), JS у меня сейчас такой, прошу не смеяться - я только учусь
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$(document).ready(function() { 
 
 $('.tip').each(function(){
  var myTip = $(this),
      clickTip = myTip.children('a'),
      tip = myTip.find('span.answer , span.answer-left'),
      tipW = tip.width(),
      tipH = tip.height(),
      winW = $(window).width(),
      winH = $(window).height();
 
  tip.hide().append('<b>X</b>'),
      closeTip = tip.children('b');
 
  function showTip(e){
  e.preventDefault();
  var xM = e.pageX, 
      yM = e.pageY,
      scrollwinH = $(window).scrollTop(),
      scrollwinW = $(window).scrollLeft(),
      curwinH = $(window).scrollTop() + $(window).height();
  if ( xM > scrollwinW + tipW * 2 ) {tip.removeClass('answer').addClass('answer-left');}
     else {tip.removeClass('answer-left').addClass('answer');}
  if ( yM > scrollwinH + tipH && yM > curwinH / 2 ) {tip.addClass('a-top');} 
     else {tip.removeClass('a-top');}
 
  tip.fadeIn(100).css('display','block');}
 
  function hideTip(n){                  
    tip.fadeOut(300);
    n.stopPropagation();}
 
  clickTip.click(showTip);
  closeTip.click(hideTip);
 });
});
к нему прилагается вот такой HTML
HTML5
1
<span class="tip"><a tabindex="1"><em>?</em></a><span class='answer'>Тут текст подсказки</span></span>
Там еще длинный CSS но думаю он не столь важен. Код такой потому что идея в том что подсказка будет корректно работать даже с отключенным JS.

Ну так вот, хочется сделать так чтобы когда тег em присутствует, (ему через стили задается вид кнопочку как вы уже догадались), то подсказка появляется по клику, как сейчас и происходит. Но когда его нет, т.е. это просто текст-ссылка, подсказка появляется при наведении. Вот такая мысль, а у меня ступор в плане реализации...
0
 Аватар для Mullih
92 / 71 / 8
Регистрация: 05.08.2012
Сообщений: 138
29.01.2013, 13:55
как и писали выше

JavaScript
1
2
3
4
5
6
7
8
9
jQuery(function ($) {
    $('.tip').not($('.tip em').closest('.tip')).mouseover(function () {
        alert($(this).text());
    });
 
    $('.tip em').closest('.tip').click(function (e) {
        e.preventDefault();
    });
});
если не так то кусок html дайте где присутсвуют оба варианта и обвертка их родителя, а то сложно по словам и отрывку селекторы сочинять)
0
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
29.01.2013, 13:58
По моему проще будет добавить еще один класс к ссылке, к которой добавлять событие
0
 Аватар для Mullih
92 / 71 / 8
Регистрация: 05.08.2012
Сообщений: 138
29.01.2013, 14:01
Цитата Сообщение от Dolphin Посмотреть сообщение
По моему проще будет добавить еще один класс к ссылке, к которой добавлять событие
смысла гадать нету тк пример приведенный сразу отличается от дальнейшего как минимум вложениями, чувствуется следующии пример будет тоже отличатся от 2-х предыдущих
0
 Аватар для Soldado
901 / 833 / 198
Регистрация: 28.06.2012
Сообщений: 1,607
Записей в блоге: 4
29.01.2013, 14:06
JavaScript
1
2
tip = myTip.find('span.answer , span.answer-left'),
      tipW = tip.width(),
Вы в переменную заносите несколько объектов, а затем в другую переменную заносите ширину как-будто у них ширина одна на всех, ну и дальше в том же духе.
0
 Аватар для Mullih
92 / 71 / 8
Регистрация: 05.08.2012
Сообщений: 138
29.01.2013, 14:21
дайте плиз html
0
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10
29.01.2013, 16:59  [ТС]
прошу простить что сразу дал не то что надо, просто подумал дело в этом, моя вина, простите что ввел в заблуждение.
Второй пример и есть именно ОН, т.е. код такой у меня и есть, вот скидываю все как это есть в моем исходном файле, вместе с JS, CSS, HTML. Естественно , что подсказок может быть не всего две, а больше.
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<!DOCTYPE html>
<html>
<head>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script>
<script>
$(document).ready(function() { 
 
 $('.tip').each(function(){
  var myTip = $(this),
      clickTip = myTip.children('a'),
      tip = myTip.find('span.answer , span.answer-left'),
      tipW = tip.width(),
      tipH = tip.height(),
      winW = $(window).width(),
      winH = $(window).height();
 
  tip.hide().append('<b>X</b>'),
      closeTip = tip.children('b');
 
  function showTip(e){
  e.preventDefault();
  var xM = e.pageX, 
      yM = e.pageY,
      scrollwinH = $(window).scrollTop(),
      scrollwinW = $(window).scrollLeft(),
      curwinH = $(window).scrollTop() + $(window).height();
  if ( xM > scrollwinW + tipW * 2 ) {tip.removeClass('answer').addClass('answer-left');}
     else {tip.removeClass('answer-left').addClass('answer');}
  if ( yM > scrollwinH + tipH && yM > curwinH / 2 ) {tip.addClass('a-top');} 
     else {tip.removeClass('a-top');}
 
  tip.fadeIn(100).css('display','block');}
 
  function hideTip(n){                  
    tip.fadeOut(300);
    n.stopPropagation();}
 
  clickTip.click(showTip);
  closeTip.click(hideTip);
 });
});
</script>
<style>
.tip {
 display:inline-block;
 position:relative;
}
.tip em {
 position:relative;
 background:#FD6E00;
 text-align:center;
 border-radius: 20px;
 border: 1px solid #ccc;
 color: #fff;
 font: normal bold 12px Arial;
 text-decoration: none;
 cursor:pointer;
 padding: 0 4px;
}
.answer>b,
.answer-left>b {
 position:absolute;
 font: normal bold 14px Comic Sans MS;
 color:#999;
 cursor:pointer;
 padding: 4px;
}
.answer>b,
.answerimg>b {
 top:0;
 right:0;
}
.answer-left>b {
 top:0;
 left:0;
}
.answer>b:hover,
.answer-left>b:hover {color:#000;}
 
.answer, 
.answer-left { 
 display:none;
 position:absolute;
 z-index:9998;
 background: #EDEDED;
 border-radius: 3px;
 border: 1px solid #ccc;
 color: #000;
 font: normal 500 14px Trebuchet MS;
 text-align:left;
 text-shadow: 0 1px 2px #fff, 0 0 10px #E0F1FF;
 text-decoration: none;
 opacity:.9; 
 cursor:default;
 margin-top:-30px;
 width: 200px;
 min-height: 50px;
 max-height: auto;
 white-space: normal;
}
.answer {
 box-shadow: 5px 5px 0.5em -0.1em rgba(0,0,6,0.5);
 right: -240px;
 padding: 5px 20px 7px 7px;
}
.answer-left {
 box-shadow: -5px 5px 0.5em -0.1em rgba(0,0,6,0.5);
 left: -240px;
 padding: 5px 7px 7px 20px;
}
.a-top {
 bottom: -10px;
}
 
.a-top:before,
.answer:before, 
.answer-left:before {
 content:"";
 position:absolute;
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAArElEQVQ4T5WSMQ7DIAxFnazt1qFbb9D7j+yAxEk4g2Mj/8hFkAZLXyLmv6+AIWYeKufMEM3qCqy1Xgd4KKW0eRBCT/aNsjLoFWMcgn2A+NS/N1gWb2n+/OpM8BhHCt0CIR+wBEJnwCoInfBqAJjpeGaCVzkqpehtf+8EwCNSbmtzDiHs0nhg8x+o/nbb3Qv7jALQa7P15WGVmJ4+AGuREa56WKXncRDLt7l9ER2tcpC0SynvkgAAAABJRU5ErkJggg==) no-repeat;
 width: 9px;
 height: 15px;
}
.answer:before {
 left: -9px;
 margin-top: 10px;
 background-position: 0 0;
}
.answer-left:before {
 right: -9px;
 margin-top: 10px;
 background-position: -9px 0;
}
.a-top:before {
 bottom: 10px;
}
.tip>a:focus~span.answer,
.tip>a:focus~span.answer-left {
 display:block;
}
.tip>a[tabindex="1"]:focus {
 outline: none;
}
.tip>a[tabindex="1"]:focus>em {
 background:#FF4F19;
}
</style>
</head>
<body>
<div>
<br>
Тут контент
<br>
<br>
<div>
Тут контент
<span class="tip"><a tabindex="1"><em>?</em></a><span class='answer'>Тут текст подсказки по клику</span></span>
<br>
</div>
<br>
<span class="tip"><a href="#" tabindex="1">SomeLink</a><span class='answer'>Тут текст всплывающей подсказки</span></span>
<br>
Тут контент<span class="tip"><a tabindex="1"><em>?</em></a><span class='answer'>Тут текст подсказки по клику</span></span>
<br>
Тут контент<span class="tip"><a href="#" tabindex="1">SomeLink</a><span class='answer'>Тут текст всплывающей подсказки</span></span>
</div>
</body>
</html>


Soldado - я же только вникаю в суть. Ширина у них и так одинаковая, а вот высота "резиновая", т.е. увеличивается в зависимости от длина текста. Или я чего еще не понимаю...
Dolphin - в том и дело что хотелось бы поменьше классов использовать, чтобы не заморачиваться...
Mullih - свой оригинал скинул, сейчас попробую с вашим решением.
0
 Аватар для Mullih
92 / 71 / 8
Регистрация: 05.08.2012
Сообщений: 138
29.01.2013, 17:17
строка 38 замените на блок

JavaScript
1
2
3
4
5
if (myTip.is(':has(a > em)')) {
    clickTip.click(showTip);
} else {
    myTip.children().first().mouseover(showTip);
}
1
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10
29.01.2013, 17:55  [ТС]
Вот! Именно эту конструкцию я не мог сообразить, Спасибо Mullih и всем кто принимал участие и помогал
Может у кого возникнут решения по оптимизации данного детища, я буду только рад и примного благодарен. Еще раз всем, большое спасибо.
0
 Аватар для Mullih
92 / 71 / 8
Регистрация: 05.08.2012
Сообщений: 138
29.01.2013, 18:10
возникнут решения по оптимизации данного детища
красивее будет просто подписаться по отдельности для ховера и клика и если к кому событие и прийдет сгененрировать подсказка, и пробиндить закрытие

а не городить ветки условий

но это мое ИМХО
0
 Аватар для Soldado
901 / 833 / 198
Регистрация: 28.06.2012
Сообщений: 1,607
Записей в блоге: 4
29.01.2013, 18:36
Могу предложить ещё такой вариант: демо-страница.
Предположим. что есть много таких пар элементов с одинаковым классом:
JavaScript
1
2
<a class='class1' href="#" >SomeText1</a>
<span class='class1'><em data-title="1.Подсказка">?</em></span>
Тогда mouseover только для ссылки может быть таким:
JavaScript
1
2
3
$('.class1').not($('.class1 em').parent()).mouseover(function(){
...
});
В вышеприведённом коде исключаются элементы с таким же классом у которых внутри есть em, как Вы и просили
вызвать событие при наведении на первую ссылку, без тега em, но чтобы это событие не работало при наведении на вторую - с тегом em.
Клик по элементу em будет таким:
JavaScript
1
2
3
$('.class1 em').click(function(){
     ....
});
По этим события и запускается функция вывода блока подсказки.
Обычно я местоположение блока подсказки получаю из координат (offset) кликнутого элемента плюс/минус какое-то смещение. Информацию для блока подсказки можно хранить, предположим, в атрибуте data-title кликнутого элемента. Сам блок подсказок изначально невидим и абсолютно позиционирован (в стилях). Скриптом мы задаём блоку подсказок новые координаты и показываем его.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function podskazka(){
$('#podskazka').css('display','none');// скрываем предыдущую подсказку   
var coopd=myobject.offset();// получаем координаты кликнутого объекта
var topB=coopd.top;
var leftB=coopd.left;
topB=topB-20;// задаём смещение
leftB=leftB+16;
var textP=myobject.attr('data-title');// в переменную заносим текст подсказки  
$('#podskazka').css({ // задаём новые координаты блоку подсказок
top:topB,
left:leftB,
});
$('#podskazka').fadeIn(300).text(textP);// показываем подсказку с соответствующим текстом
};
1
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10
29.01.2013, 19:08  [ТС]
Mullih, теперь тоже так думаю, вообще изначально идея у меня была простая - клик подсказка только на CSS, вот ее изначальный вариант - http://www.magentawave.com/201... n-css.html, но потом решил я немного автоматизировать и улучшить процесс, но только без плагинов - маленький JS (чисто функционал - позиционирование, закрытие и вот собственно бонус, возможность появления без клика), вот "докатился" до такого скрипта... Но как я уже говорил, я - начинающий, поэтому возможно и "горожу" пока как могу.

Добавлено через 15 минут
Soldado, да это хороший вариант, но что будет если у пользователя отключен JS ? Просто у меня идея была в универсальности, чтобы работало "и так, и так" , но ваш вариант хорош, тем более что атрибутом data-title можно управлять через CSS.
Я тоже сперва пробовал через offset, но потом отказался, он плохо проявил себя когда страница длинная и у исходного документа много родительских блоков :
HTML5
1
2
3
4
5
6
7
8
9
10
<div class='someClass'>
 <div class='someClass'>
  <div class='someClass'>
тут еще чего-нибудь
  </div>
   <div class='someClass'>
Тут контент и подсказки
   </div> 
 </div>
</div>
хотя возможно я что-то не правильно делал...

Добавлено через 14 минут
Mullih - хороший ресурс, буду читать, ума-разума набираться. А то бывает ищешь, находишь, начинаешь читать, а там вроде и разжевано, а ни чего не понятно.

Еще раз всем огромное спасибо за помощь, и что не оставили без внимания . Буду учится дальше.
0
 Аватар для Soldado
901 / 833 / 198
Регистрация: 28.06.2012
Сообщений: 1,607
Записей в блоге: 4
29.01.2013, 19:13
Ну если у одного из тысячи и может быть отключен js - то этот пользователь останется без подсказок. Думаю, что задумываться о таком вообще не стоит. А вдруг кто-то картинки отключит и flash плеер не установит?

Если использовать css3 то можно такое сделать
0
 Аватар для Probka
2 / 2 / 0
Регистрация: 13.01.2013
Сообщений: 10
29.01.2013, 19:32  [ТС]
Цитата Сообщение от Soldado Посмотреть сообщение
А вдруг кто-то картинки отключит и flash плеер не установит?
тогда это провал! . Ну а если серьезно, то вы конечно правы, таких, которые без JS, нынче очень мало.
Про такой трюк на CSS3 я знаю, только не думал что он и через обычный title работает, использовал как-то именно data-title для такой штуки, на картинках особенно хорошо смотрится это дело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2013, 19:32
Помогаю со студенческими работами здесь

Как правильно создавать объекты на форме?
Задача следующей программы рисовать гибкий график функции на поле класса PictureBox. Для этого я создал класс, в котором объявляется объект...

Как правильно удалить объекты из списка?
List&lt;mytype&gt; dinx = new List&lt;mytype&gt;(); объекты типа picturebox метод dinx.Clear() не помогает! они остаются как правильно...

Как правильно передавать ссылки на объекты ?
Я чутка запутался, подскажите, если знаете, какой вариант лучше? 1. Как-то глобально, на примере форм ...

Объекты. Как правильно инициализировать и удалить перемнные
Есть довольно сложная задача. 1-й класс считает. 2-й класс делает интерфейс. Первый от второго получает значения переменных и создает...

Как правильно рендерить объекты вокруг камеры?
Добрый день. Впервые занимаюсь созданием 3д пространства при помощи lwjgl на java. Столкнулся с такой вот проблемой: У меня есть 2 куба,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru