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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делаем ссылки с подтверждением - 2, С помощью нового атрибута... 
:(
    Опции темы
GZep
  Дата 5.11.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Вот, написал небольшой, но думаю очень полезный скрипт.

Вставляем в страницу код javascript:
Код

window.onload=function() {
    content_links = document.getElementsByTagName('a');
    for(i=0; i<content_links.length; i++) {
        if (content_links[i].getAttribute('confirm')) {
            content_links[i].onclick = function () {
                if (!confirm(this.getAttribute('confirm'))) {
                    if (document.all) {
                        event.returnValue = false;
                    } else {
                        event.preventDefault();
                    }
                }

            }
        }
    }
}


Теперь создаем html ссылки:

<a href="index.html" confirm="Вы действительно хотите перейти по ссылке?">index</a>
<a href="new.html" confirm="Вы действительно хотите перейти к new.html?">new</a>


Соответственно все ссылки на странице со скриптом (если они имеют атрибут confirm) будут запрашивать подтверждение при переходе. Если атрибут confirm отсутствует(например:<a href="new.html">new</a>), то будет происходить обычный переход, без всяких вопросов...
Другие атрибуты типа target на ход выполнения скрипта повлиять не смогут...

Вот и все! smile 


M
12345c
Похожая тема: http://forum.vingrad.ru/topic-86395.html - "Как сделать ссылки с подтверждением".


Это сообщение отредактировал(а) 12345c - 7.11.2006, 16:53
PM MAIL WWW ICQ Skype GTalk   Вверх
vasac
Дата 5.11.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Забавно, конечно, но не работает.
Во-первых document.body до onload может быть еще не определен — перехватчик нужно вешать на window.
Во-вторых при отказе пользователя делается ветвление на ie/gecko, но в то же время в обоих ветках используется event, определенный только для IE.
Для зачета требуется доработка. )
PM WWW   Вверх
GZep
Дата 5.11.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Цитата

Во-первых document.body до onload может быть еще не определен

Доработал.
Цитата

определенный только для IE.

В опере работает. Поточнее скажи, как можно апгрейдить.

Это сообщение отредактировал(а) GZep - 5.11.2006, 14:16


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



То же самое (за основу взят пример с Xpoint):
Код

if (typeof window.addEventListener != "undefined") {
  // Browser with DOM suport - навешиваем обработчик по стандарту DOM на все окно
  window.addEventListener("click", function(e) {
    // рассмотрим целевой объект клика и его атрибут confirm (если есть)
    var t = e.target, c=t.attributes["confirm"];
    /* если есть атрибут href (ссылка или map), и есть наш атрибут, и на предложение перейти юзер ответил "нет",
            то блокируем действие по умолчанию;
       если какое-то из этих условий не выполнилось, то ничего не делаем */
    if (t.href && c && !confirm(c.value)) e.preventDefault();
  }, false); // последний аргумент - фаза, на которой перехватываем событие
}
else if (typeof document.attachEvent != "undefined") {
  // Stupid IE - не понимает по стандарту, навешиваем обработчик на документ и по-микрософтовски)
  document.attachEvent("onclick", function() {
    // тоже смотрим целевой объект
    var t = event.srcElement;
    // IE автоматом превращает атрибуты в свойства - используем это для сокращения записи,
    // смысл тот же, что в "стандартной" ветке
    return (!(t.href&&t.confirm&&!confirm(t.confirm)));
  });
}

GZep, все-таки любите Вы циклы там, где без них куда удобнее...

Это сообщение отредактировал(а) SelenIT - 5.11.2006, 15:13


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 5.11.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



SelenIT, извините, но не совсем все понятно в коде... smile немогли бы Вы облагородить код комментариями...

P.S. обожаю циклы, они такие...эээ...бесконечные... smile 

P.S.(2) а ИЕ правда "Stupid", т.е. тупой?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, комментарии вписал (попутно одну строчку еще компактнее сделал). А по поводу IE... первоначальные комменты остались от оригинального примера, возможно, автор немного пристрастен (хотя и невероятно компетентен), но необходимость поддерживать несколько веток кода и эмулировать стандартные возможности обходными путями несколько утомляет. Хотя у IE есть и свои полезные фичи, которые, наверное, стоило бы внести в официальный стандарт... но это уже тема для флейма и холивора)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 5.11.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



  • Переменные, конечно, прикольно названы (по одной букве латинского алфавита и ничего не говорят о своих значениях, для чего они). Это не главное, но код трудно понять... smile 
  • Хотелось бы знать, какой способ более экономичен для системных ресурсов. Мой, с циклом, или этот, который учитывает полоумность ИЕ. Так какой?
  • Мой вариант работает и в ИЕ и в опере. Не знаю, за что его так хаить можно...
  • Вариант с Xpoint надо заносить в window.onload?
 smile 

Это сообщение отредактировал(а) GZep - 5.11.2006, 17:42


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep,
  • Переменные - просто псевдонимы для target/srcElement события (первая буква от target) и атрибута confirm (тоже первая буква), в дальнейшем они не меняются, используются в основном именно для сокращения записи.
  • Я считаю, что экономичнее этот, где используется один экземпляр функции на все клики вместо множества клонов - по количеству ссылок. Кроме того, он не "убивает" другие обработчики onclick, если таковые уже прописаны.
  • Приведенный мной вариант работает в IE, Gecko, Opera (вне зависимости от того, чем она представляется). Ваш вариант по-своему неплох, но все же менее универсален (см. выше).
  • Заносить в onload ничего не надо - приведенный код самодостаточен и начинает работать сразу в момент включения (по-моему, даже не дожидаясь полной загрузки, в т.ч. в IE).


Это сообщение отредактировал(а) SelenIT - 5.11.2006, 18:05


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 5.11.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Ну, что тут сказать... smile ...наверное, все-таки ваш вариант получше будет. Я просто подумал, если на странице будет больше 50 линков, то мой скрипт даст о себе знать через "тормоза". Спасибо. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 5.11.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Вся проблема в том, что моего уровня знаний нехватает для того, чтобы писать такие функции, какие пишите Вы. От этого и идут мои проблемы. smile 

Это сообщение отредактировал(а) GZep - 5.11.2006, 19:37


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 5.11.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

Вся проблема в том, что моего уровня знаний нехватает...

Да не проблема это вовсе! Уровень поднимется - не успеете оглянуться! Чего я, кстати, всем желаю (т.е. поднятия уровня)! Себя не забуду - себе я желаю этого в первую очередь! ;)
Я тут попробовал написать чуть-чуть по-другому. Не совсем серьезно, типа по-модному - сейчас же в "ходу" всякие-разные "библиотечные" варианты, ООП и все-такое. Короче говоря - сделал вот таким объектом (на самом деле - то же, что и в первом варианте этой темы):
Код

({init_links : function() {
    var links = document.links, fn = this.add_handler,
    hd = this.confirm_transit, item;
    for(var i = 0, l = links.length; i < l; i++) {
      if((item = links[i]).getAttribute('confirm')) fn(item, 'onclick', hd);
    }
  },   
  confirm_transit : function(e) {
    var el = e.srcElement || this, c;
    while(!(c = el.getAttribute('confirm'))) el = el.parentNode;
    if(!confirm(c)) (e.preventDefault) ? e.preventDefault() : e.returnValue = false;
  },
  add_handler : function(o, e, f) {
    f = f || (function(a) { return function() { a.init_links(); }})(this);
    (o.attachEvent) ? o.attachEvent(e, f) : (o.addEventListener) ? 
      o.addEventListener(e.substr(2), f, !1) : '';
  }
}).add_handler(window, 'onload');


Это сообщение отредактировал(а) AKS - 6.11.2006, 21:33
PM MAIL   Вверх
SelenIT
Дата 6.11.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



AKS, по-моему, отлавливать ссылки через getElementsByTagName('a') слегка неудобно: не все теги A - ссылки, и не всё, что действует как  ссылки - теги A (бывают еще map + area, я сам в молодости ими, признаться, злоупотреблял). ИМХО проверка наличия атрибута href как-то понадежнее... Хотя могу в этом и заблуждаться.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 6.11.2006, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, 
Цитата

отлавливать ссылки через getElementsByTagName('a') слегка неудобно...

Наверно... Можно попробовать так (в попытке достичь чуть большего "удобства" ;) ):
Код

var links = document.links;

PM MAIL   Вверх
GZep
Дата 6.11.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Спасибо. Я долго думал, какой вариант предпочтительней, мой, или тот, что предложил SelenIT. В общем, все-таки как тут не крути, но циклом присваевать всем ссылкам с атрибутом confirm функцию при нажатии гораздо менее удобнее чем просто отлавливать переходы по ссылкам. Все, я сдаюсь и циклы в подобных ситуациях признаю неприемлимыми. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




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


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

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