Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как сделат так, чтобы onmouseout учитывал увеличившийся размер контейнера? (https://javascript.ru/forum/dom-window/54390-kak-sdelat-tak-chtoby-onmouseout-uchityval-uvelichivshijjsya-razmer-kontejjnera.html)

jaroslav.tavgen 15.03.2015 16:56

Как сделать так, чтобы onmouseout учитывал увеличившийся размер контейнера?
 
Возьмём вот такой код:

<span id="one" onmouseover="AddString()" onmouseout="RemoveString()">Pervaya Stroka

  <span id="two" style="display:block"></span>

</span>

<script>

function AddString() {

    document.getElementById("two").innerHTML = 'VtorayaStroka';

}

function RemoveString() {

    document.getElementById("two").innerHTML = '';

}
</script>


Когда наводишь мышкой на "Pervaya Stroka", скрипт добавляет вторую строку. Когда уводишь курсор с первой строки, вторая строка исчезает.

Надо: Когда наводишь мышкой на "Pervaya Stroka", скрипт добавляет вторую строку. Когда уводишь курсор с первой строки В ЛЮБОЕ МЕСТО, КРОМЕ ВТОРОЙ СТРОКИ, вторая строка исчезает.

Если честно, текущих знаний мне не хватило, чтобы это реализовать.

Что я пробовал:

<span id="one" onmouseover="AddString()">Pervaya Stroka

  <span id="two" style="display:block"></span>

</span>

<script>

function AddString() {

    var element = document.getElementById("one");

    element.removeEventListener("mouseover", AddString);

    document.getElementById("two").innerHTML = 'VtorayaStroka';
	
	element.addEventListener("mouseout", RemoveString, true);
	

}

function RemoveString() {

    var element = document.getElementById("two");

    element.removeEventListener("mouseout", RemoveString);

    element.innerHTML = '';
	
	element.addEventListener("mousever", AddString, true);

}
</script>


с расчётом на то, что если удалить ивент и сразу его добавить, то скрипт пересчитает высоту контейнера. Ан-нет - результат тот же.

Как добиться нужного результата?

рони 15.03.2015 17:02

jaroslav.tavgen,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
   #one:hover+#two,#two:hover {
        display: block;
   }
   #two{
     display: none;
   }

  </style>
</head>

<body>
<span id="one">Pervaya Stroka</span>
<span id="two">VtorayaStroka</span>
</body>

</html>

jaroslav.tavgen 15.03.2015 17:04

Рони, то же самое. При наведении с первой строки на вторую, вторая строка исчезает

(нужно тестировать, сделав большой зум в браузере и медленно двигая мышку, иначе в какой-то момент действительно почему-то курсор "проскочит" и вторая строка сохранится - от чего это зависит, я пока не понимаю)

рони 15.03.2015 17:34

jaroslav.tavgen,
:)
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
   #one:hover+#two,#two:hover {
         height: 30px;
         transition-delay: 0s;
   }
   #two{
     transition-delay: .3s;
     display: block;
      height: 0px;
      overflow: hidden;
   }

  </style>
</head>

<body>

<span id="one">Pervaya Stroka</span>
<span id="two">VtorayaStroka</span>
</body>

</html>

jaroslav.tavgen 15.03.2015 17:37

рони, спасибо! Выглядит рабочим вариантом.

jaroslav.tavgen 15.03.2015 18:04

рони, а есть вариант, при котором бы скрипт так же сработал при втором span, находящемся внутри первого? И чтобы было не средствами CSS, а средствами javascript?

Дело в том, что в реальном приложении второй span заполняется аяксовским запросом каждый раз при наведении мыши, а если делать 2 span'a не вложенными 1 в другой, то там нарушается расположение объектов... Мне явно надо подучить CSS, чтобы лучше контроллировать такие моменты, но хотелось бы эту конкретную проблему решить побыстрее...

рони 15.03.2015 18:36

Цитата:

Сообщение от jaroslav.tavgen
при втором span, находящемся внутри первого?

#one:hover>#two

jaroslav.tavgen 15.03.2015 19:15

Цитата:

Сообщение от рони (Сообщение 361363)
#one:hover>#two

Спасибо! Работает. Попробую внедрить этот вариант, но может быть, кто-нибудь знает вариант не с CSS, а с JS?

jaroslav.tavgen 17.03.2015 15:58

Нет, рано переходить на CSS.

Я не понимаю, какого РОЖНА вот этот код не работает?!

<span id="one" onmouseover="AddString()">Pervaya Stroka

  <span id="two" style="display:block"></span>

</span>

<script>

function AddString() {

    var element = document.getElementById("one");

    element.removeEventListener("mouseover", AddString);

    document.getElementById("two").innerHTML = 'VtorayaStroka';
	
	element.addEventListener("mouseout", RemoveString, true);
	

}

function RemoveString() {

    var element = document.getElementById("two");

    element.removeEventListener("mouseout", RemoveString);

    element.innerHTML = '';
	
	element.addEventListener("mousever", AddString, true);

}
</script>


Смотрите, есть контейнер. После наведения мыши ВЫСОТА КОНТЕЙНЕРА УВЕЛИЧИВАЕТСЯ. _ПОСЛЕ_ этого добавляется ивент "mouseout", который должен учитывать контейнер в НОВОМ состоянии (он вообще не должен "знать", каким он был первоначально).

Нет же, когда наводишь мышкой в то место, куда увеличился контейнер - он исчезает.

Как это может быть?! Тут логики же никакой. Дело в скорости загрузки? Объект не успел обновить данные? Кэш работает? Или что?

Объясните, пожалуйста.

рони 17.03.2015 16:08

jaroslav.tavgen,
строка 30


Часовой пояс GMT +3, время: 11:56.