Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Всплывающий DIV "по клику", DIV с таймером 
V
    Опции темы
Pitbul
  Дата 3.1.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Добрый день! Сегодня появился вопрос в JS, который я не могу решить своими знаниями. smile 

К примеру есть на странице такие элементы:
1. Ссылка
2. DIV с опросом

(Показано на картинке)

Как реализовать всплывающий ДИВ поверх ссылки по событию "клик". Всплывший ДИВ живет только 10 сек, потом исчезает и больше не появляется. И по повторному клику на нашей ссылке уже идет нужный переход smile 

Огромное спасибо! smile 



Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  _____.jpg 48,92 Kb
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Amphiluke
Дата 3.1.2010, 22:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Примерно
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
<script type="text/javascript">
    function linkClick(sender) {
        var tsd = document.getElementById("tenSecDiv");
        if (tsd == null) return true;
        tsd.style.left = sender.offsetLeft.toString() + "px";
        tsd.style.top = sender.offsetTop.toString() + "px";
        tsd.style.display = "block";
        window.setTimeout(function() {document.getElementsByTagName("body")[0].removeChild(tsd);}, 10000);
        return false;
    }
</script>
</head>

<body>
    <form action="#">
        <a href="http://www.google.com" onclick="return linkClick(this);">link</a>
        <div style="background: #9A99CB; width: 250px;">
            Вы читаете книги?<br />
            <input type="button" value="Да" /> <input type="button" value="Нет" /> 
        </div>
    </form>
    <div id="tenSecDiv" style="background: #3FB200; display: none; position: absolute; width: 250px;">ответьте на вопрос:</div>
</body>
</html>


PM   Вверх
Amphiluke
Дата 3.1.2010, 22:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Ради IE нужно немного добавить:
Код

<script type="text/javascript">
    function getTruthPos(elem) {
        var pos = {x: elem.offsetLeft, y: elem.offsetTop};
        elem = elem.offsetParent;
        while (elem) {
            pos.x += elem.offsetLeft;
            pos.y += elem.offsetTop;
            elem = elem.offsetParent;
        }
        return pos;
    }
    function linkClick(sender) {
        var tsd = document.getElementById("tenSecDiv");
        if (tsd == null) return true;
        var pos = getTruthPos(sender);
        tsd.style.left = pos.x.toString() + "px";
        tsd.style.top = pos.y.toString() + "px";
        tsd.style.display = "block";
        window.setTimeout(function() {document.getElementsByTagName("body")[0].removeChild(tsd);}, 10000);
        return false;
    }
</script>

PM   Вверх
12345c
Дата 4.1.2010, 06:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 6
Всего: 101



Задача решена, но что мешает юзеру сделать так: правый клик мыши, затем нажать Open. Это к тому, что в href тогда не следует держать ссылку.

И для простоты, если задача позволяет, я бы сделал просто замещение текста this.text и this.className нужными значениями, затем обратную установку this.text и this.className + добавление this.href. Тогда не нужны позиции и кроссбраузерность.
Код
<script>
onload = function(){
    if(!document.all && !self.opera) document.styleSheets[0].insertRule(".preread{cursor:pointer}",1)
    var a = document.getElementsByName('preread');
    for(var i=0;i<a.length;i++){ //пробежаться по всем  name="preread", расставить клики
        a[i][/*@cc_on'attachEvent'||@*/'addEventListener'](/*@cc_on'on'+@*/'click', function(ev){
            ev=ev||event;
            var t = ev.target || ev.srcElement; //для замыкания
            if(t.href == t.hSave) return;
            t.className = "prereading"; //стиль объявления (только первый раз, когда нет t.href)
            t.setAttribute('save', t.innerHTML);
            t.innerHTML = t.getAttribute('t2'); //текст объявления
            t.blur();  //на усмотрение, для IE
            setTimeout(function(){ //замыкательная ф. с удержанным t
                t.innerHTML = t.getAttribute('save');
                t.className = "preread"; //восст.стиль и текст
                t.href = t.getAttribute('hSave'); //открыть ссылку
            }, 1500);
            return!1;
        },!1);
    }
}
</script>

<body>
<style id="s1">.preread{
    display: block;
    width:300px;
    padding:3px 6px;
    background: #eee;
    cursor:auto;
}
.prereading{
    display: block;
    width:300px;
    padding:2px 5px;
    border:1px solid black;
    background: yellow;
    text-decoration:none;
    color: black;
    cursor:inherit;cursor=default; /*в таком виде немного помогает Опере 9.27, но конфл с FF*/
}</style>
JS. Инструменты. Принудительный предпросмотр объявления при клике.
<a href=# class="preread" name="preread" hSave="http://ya.ru/" t2="А вы читали? ...">Текст ссылки</a><br>
<br>
<br>
<a href=# class="preread" name="preread" hSave="http://yandex.ru/" t2="А вы читали2? ...">Текст ссылки2</a>
</body>



--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
Pitbul
  Дата 4.1.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Огромное спасибо за помощь!
Сейчас буду разбираться с кодом, чуть позже отпишусь о результатах smile 
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Pitbul
Дата 4.1.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Второй вариант не сумел интегрировать в свой код, а так он работает интересно smile 

Первый вариант - получилось выполнить, но с позициями выведения блока - проблемы smile 

А в целом, как внедрить в такой код, что-то максимально простое по этим же алгоритмам?

Код

<html>
<head>
    <title>Ex</title>
</head>

<body>
<style>
    #box {margin: 0 auto 0; background-color: #f5d763; width: 500px; height: 150px; border: 1px solid;}
    p {margin: 10px;}
    #q {margin: 5px 10px 5px; padding: 5px; background-color: #ea8df7; width: 300px; height: 40px; border: 1px solid;}
</style>
<div id="box">

<p>A lot of text</p>
<p><a href="#">LINK</a></p>
<div id="q">
Do you reading books?
<br><a href="#">YES</a> or <a href="#">NO</a>
</div>

</div>
</body>
</html>


И если у меня <a href="#">LINK</a> - будет еще выполнено в форме кнопки картинки, это не повлечет за собой изменений? smile 
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Amphiluke
Дата 4.1.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Цитата(Pitbul @  4.1.2010,  15:22 Найти цитируемый пост)
с позициями выведения блока - проблемы


Цитата(Pitbul @  4.1.2010,  15:22 Найти цитируемый пост)
A lot of text


Проблемы какого рода, конкретнее? Если очень «lot of text», и до контейнера с вопросом и кнопками нужно прокручивать документ с помощью полос прокрутки, то к верхней координате выводимого плавающего div'а нужно прибавлять величину этой прокрутки — типа document.documentElement.scrollTop.

Добавлено через 1 минуту и 55 секунд
И, кстати не нужно располагать дескриптор <style> в секции <body>. Это невалидно.
PM   Вверх
Pitbul
  Дата 4.1.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Проблема связана с тем, что всплывающее окно выводится над ссылкой - не закрывая ее в целом.

Но отойдем от этого, возможна ли такая схема работы скрипта:

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

Тогда вроде позиционирование не так и важно? Ведь можно отталкиваться от изначальной ссылки и подобрать такие габариты всплывающего элемента, что бы он грамотно перекрывал ее. smile 

--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Amphiluke
Дата 4.1.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



У меня не возникает проблем с позиционированием и перекрытием.
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
<style type="text/css">
    #tenSecDiv {
        background: #3FB200;
        display: none;
        position: absolute;
    }
</style>
<script type="text/javascript">
    function getTruthPos(elem) {
        var pos = {x: elem.offsetLeft, y: elem.offsetTop};
        elem = elem.offsetParent;
        while (elem) {
            pos.x += elem.offsetLeft;
            pos.y += elem.offsetTop;
            elem = elem.offsetParent;
        }
        return pos;
    }
    function linkClick(sender) {
        var tsd = document.getElementById("tenSecDiv");
        if (tsd == null) return true;
        var pos = getTruthPos(sender.getElementsByTagName("img")[0]);
        with (tsd.style) {
            width = sender.getElementsByTagName("img")[0].offsetWidth.toString() + "px"; /* или "250px", если хотите */
            height = sender.getElementsByTagName("img")[0].offsetHeight.toString() + "px";
            left = pos.x.toString() + "px";
            top = pos.y.toString() + "px";
            display = "block";
        }
        window.setTimeout(function() {document.getElementsByTagName("body")[0].removeChild(tsd);}, 10000);
        return false;
    }
</script>
</head>

<body>
    <form action="#">
        <a href="http://www.google.com" onclick="return linkClick(this);"><img src="http://heroeslands.com/pic/ava/x11.gif" alt="" height="80" width="50" /></a>
        <div style="background: #9A99CB; width: 250px;">
            Вы читаете книги?<br />
            <input type="button" value="Да" /> <input type="button" value="Нет" /> 
        </div>
    </form>
    <div id="tenSecDiv" style="">ответьте на вопрос:</div>
</body>
</html>

PM   Вверх
Pitbul
Дата 4.1.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Amphiluke

С позиционированием все стало ОК. А вот таймер теперь не работает: попробуйте нажать на зеленую кнопку "СКАЧАТЬ"

http://gamehouse.com.ua/for_girls/perepoloh-na-rancho


--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Amphiluke
Дата 4.1.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Блин, нашел, где ошибка. Разместите всплывающий div в прямо body, а не в другом div. Скрипт расчитан на то, что родительский объект — именно body.

Добавлено через 5 минут и 19 секунд
А можно просто заменить это:
Код

window.setTimeout(function() {document.getElementsByTagName("body")[0].removeChild(tsd);}, 10000);

на это:
Код

window.setTimeout(function() {tsd.parentNode.removeChild(tsd);}, 10000);

и тогда безразлично, где размещать div.
PM   Вверх
Pitbul
Дата 4.1.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Вот теперь все здорово! Проблема решенная!

width = sender.getElementsByTagName("img")[0].offsetWidth.toString() + "px";
height = sender.getElementsByTagName("img")[0].offsetHeight.toString() + "px";

А если я в этих строчках меняю "px" на "100 px", то должна увеличиваться длина и ширина всплывающего ДИВа на 100 пикселей? НИкак не могу найти строки, которые отвечают за размеры всплывающего элемента smile 
            
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
Amphiluke
Дата 4.1.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Цитата(Pitbul @  4.1.2010,  18:24 Найти цитируемый пост)
А если я в этих строчках меняю "px" на "100 px", то должна увеличиваться длина и ширина всплывающего ДИВа на 100 пикселей? НИкак не могу найти строки, которые отвечают за размеры всплывающего элемента  

Чтобы увеличить на 100px, нужно написать:
Код

width = (sender.getElementsByTagName("img")[0].offsetWidth + 100).toString() + "px";
height = (sender.getElementsByTagName("img")[0].offsetHeight + 100).toString() + "px";


Пробелы между числом и единицей измерения недопустимы.
PM   Вверх
Pitbul
  Дата 4.1.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Все огромнейшее спасибо!=)

На сегодня с ЯваСкриптом закончу=) smile  smile  smile  smile 
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
HARDMID
Дата 14.1.2010, 10:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Хм... Работает. А вот если снова нажать, то второй раз див уже не всплывает и пропускает по ссылке.  smile 

Жена-тестер уперто нажала во второй раз. И ее пустило. 
Теперь она знает, что не надо больше читать всякие дивы и их открывать, а надо чуток подождать, и просто потом идти по ссылке. Долго материлась. Сказала нафиг это надо, я хочу быстро и сразу. И закрыла сайт... 
smile 

Это сообщение отредактировал(а) HARDMID - 14.1.2010, 10:13
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.