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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> onClick срабатывает со 2 раза 
:(
    Опции темы
Micher
Дата 27.8.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



На картинках стоит onClick, вызывающий функцию, которая слоям меняет свойства display. Почему то срабатывает со 2 раза стабильно. Причём после 2 раза, уже нормально. На простых линках такое ставил - работает нормально - сразу. Может кто сталкивался и подскажет в чём проблема... 
PM MAIL   Вверх
Rigel
Дата 27.8.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Micher @ 27.8.2007,  15:51)
На картинках стоит onClick, вызывающий функцию, которая слоям меняет свойства display. Почему то срабатывает со 2 раза стабильно. Причём после 2 раза, уже нормально. На простых линках такое ставил - работает нормально - сразу. Может кто сталкивался и подскажет в чём проблема...

Догадываюсь, что забыты какие-то умолчания, которые ставит функция при первом вызове - но, скажите пожалуйста, как можно ответить на этот вопрос конкретно, не имея перед собой текста программы?  smile 
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
Micher
Дата 27.8.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Сейчас исправлюсь.
Вызов идёт так:  

Код

<img src="images/services/MSPPpreview.jpg" onclick="hideAll('panoramas')"/>



Теперь ява-скрипт:

Код

var divs = new Array('imageView', 'panoramas', 'interactivpanoramas', 'Graphical_material_improvement', 'maps', 'interiorplan', 'interior', 'BuildingElevationsViews', 'BuildingViews', 'Community_materials');

function show(obj) {
 if (document.getElementById(obj).style.display == 'none')
  document.getElementById(obj).style.display = 'block';
   else document.getElementById(obj).style.display = 'none';
}

function hideAll(obj) {
 for (var i = 0; i < divs.length; i++) {
   if (obj != divs[i]) document.getElementById(divs[i]).style.display = 'none';
 }
 show(obj);
}



hideAll() - ставит всем слоям, кроме указанного, display: none; а указанному соотвественно display: block;

Добавлено через 9 минут и 10 секунд
Сейчас исправлюсь.
Вызов идёт так:  

Код

<img src="images/services/MSPPpreview.jpg" onclick="hideAll('panoramas')"/>



Теперь ява-скрипт:

Код

var divs = new Array('imageView', 'panoramas', 'interactivpanoramas', 'Graphical_material_improvement', 'maps', 'interiorplan', 'interior', 'BuildingElevationsViews', 'BuildingViews', 'Community_materials');

function show(obj) {
 if (document.getElementById(obj).style.display == 'none')
  document.getElementById(obj).style.display = 'block';
   else document.getElementById(obj).style.display = 'none';
}

function hideAll(obj) {
 for (var i = 0; i < divs.length; i++) {
   if (obj != divs[i]) document.getElementById(divs[i]).style.display = 'none';
 }
 show(obj);
}



hideAll() - ставит всем слоям, кроме указанного, display: none; а указанному соотвественно display: block;
PM MAIL   Вверх
Rigel
Дата 27.8.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сегодня нет времени моделировать ситуацию - разве что ты вышлешь полный вариант на ICQ-адрес. Но с ходу могу сказать, что в функции show ничего кроме одной стороки просто ненужно, и if, который берет значение стиля отображения, в особенности. Попробуй

function show(obj) 
{
  document.getElementById(obj).style.display = 'block';
}
Вторую функцию тоже надо бы разгрузить от избыточности - в этом тоже может быть проблема. Что-то типа:
function hideAll(obj) {
 for (var i = 0; i < divs.length; i++) {
   document.getElementById(divs[i]).style.display = 'none';
 }
 show(obj);
}

Это сообщение отредактировал(а) Rigel - 27.8.2007, 16:33
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
Micher
Дата 27.8.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Дело в том, что если текущий слой открыт и мы кликаем на его открытие, он должен закрыться, поэтому в show() и стоят условия
PM MAIL   Вверх
Rigel
Дата 27.8.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Micher @ 27.8.2007,  16:42)
Дело в том, что если текущий слой открыт и мы кликаем на его открытие, он должен закрыться, поэтому в show() и стоят условия

В том, что я написал, он и закроется - смотри внимательно. Они ВСЕ закроются. А потом откроется один.
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
AKS
Дата 27.8.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Micher @  27.8.2007,  16:22 Найти цитируемый пост)
hideAll() - ставит всем слоям, кроме указанного, display: none;

Так все слои изначально открыты? Если они все закрыты, то зачем "пробегать" по ним в цикле и закрывать?

PM MAIL   Вверх
Micher
Дата 28.8.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Цитата(AKS @ 27.8.2007,  17:51)
Цитата(Micher @  27.8.2007,  16:22 Найти цитируемый пост)
hideAll() - ставит всем слоям, кроме указанного, display: none;

Так все слои изначально открыты? Если они все закрыты, то зачем "пробегать" по ним в цикле и закрывать?

Всё слои изначально закрыты. Бегу по всем, потому что неизвестно, какой из них открыт в данный момент(и открыт ли вообще)

Добавлено через 1 минуту и 47 секунд
Цитата(Rigel @ 27.8.2007,  16:42)
Цитата(Micher @ 27.8.2007,  16:42)
Дело в том, что если текущий слой открыт и мы кликаем на его открытие, он должен закрыться, поэтому в show() и стоят условия

В том, что я написал, он и закроется - смотри внимательно. Они ВСЕ закроются. А потом откроется один.

Если слой открыт и мы на нём щелкаем, то он должен закрыться. А в вашем коде, сначала все закроются, потом 1 ОБЯЗАТЕЛЬНО откроется.
PM MAIL   Вверх
Micher
Дата 28.8.2007, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Цитата(AKS @ 27.8.2007,  17:51)
Цитата(Micher @  27.8.2007,  16:22 Найти цитируемый пост)
hideAll() - ставит всем слоям, кроме указанного, display: none;

Так все слои изначально открыты? Если они все закрыты, то зачем "пробегать" по ним в цикле и закрывать?

Надо попробовать запоминать в переменной  текущий открытый слой, чтоб не бегать по всем, может прокатит
PM MAIL   Вверх
AKS
Дата 28.8.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Micher @  28.8.2007,  07:46 Найти цитируемый пост)
Всё слои изначально закрыты. Бегу по всем, потому что неизвестно, какой из них открыт в данный момент(и открыт ли вообще)

Раз уж точно известно, что все слои изначально закрыты, то можно сделать проще. Можно сохранять каждый раз при открытии слоя ссылку на него в какой-нибудь переменной. Таким образом всегда будет известно, какой слой стал активным (открытым/закрытым) в момент последнего клика.

PM MAIL   Вверх
Micher
Дата 28.8.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Сделал так:

Код

var currentDiv = '';

function show(obj) {
 if (document.getElementById(obj).style.display == 'none')
  document.getElementById(obj).style.display = 'block';
   else document.getElementById(obj).style.display = 'none';
}

function hideAll(obj) {
 if ((currentDiv != obj) && (currentDiv != '')) {
   document.getElementById(currentDiv).style.display = 'none';
   currentDiv = obj;
 } else
   currentDiv = '';

 show(obj);
}


Теперь не бегу циклом по всем. Результат тот же что и раньше :(

Добавлено через 2 минуты и 32 секунды
Опа, даже больше скажу! Стало хуже работать - теперь всегда со 2 раза :( Думаю, надо как то по другому show() делать. Думаю, в нём косяк
PM MAIL   Вверх
AKS
Дата 28.8.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Micher, я имел ввиду что-нибудь, вроде этого:
Код

var CURRENT_TARGET;

function show(aID) {
    var target = document.getElementById(aID).style;
    var value = target.display == 'block'
                ? 'none' : 'block';
    if (CURRENT_TARGET && CURRENT_TARGET != target) {
        CURRENT_TARGET.display = 'none';
    };
    target.display = value;
    CURRENT_TARGET = target;
};

Вместо hideAll используйте show...
PM MAIL   Вверх
Ghirik
Дата 29.8.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Опа, даже больше скажу!  теперь всегда со 2 раза smile  smile 


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 29.8.2007, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А смотрите случайно не в Опере? А то у Оперы свои приколы с невидимыми элементами. Во всяком случае в кэш она невидимые картинки не складывает.


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Micher
Дата 29.8.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Цитата(Ghirik @ 29.8.2007,  02:08)
А смотрите случайно не в Опере? А то у Оперы свои приколы с невидимыми элементами. Во всяком случае в кэш она невидимые картинки не складывает.

Смотрю и в Опере, и IE и в Firefox, везде работает одинакого
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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