Форум hotibo.ru

Сайты - по стандартам, но не стандартные сайты!






#1 26.10.2010 14:47

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Несколько вопросов

Приветствую, коллеги
Столкнулся с некоторыми трудностями в, казалось бы, совсем несложных скриптах
Трудности следующие:

1) Есть часть кода
« prev

И есть функция, производящая некие действия и, в частности, меняющая свойство href этой же ссылки
function ShowPhoto(g, n, t, d)
{
    ...
    var Plink=document.getElementById("prev");
    var PrevAttr='javascript:ShowPhoto('+g+', '+r+', '+t+', -1)'; // некие переменные, опр. ранее
    // вариант 1
    Plink.removeAttribute("href");
    Plink.createAttribute("href", PrevAttr);
    // вариант 2
    Plink.href='javascript:ShowPhoto('+g+', '+r+', '+t+', -1)';
    ...
}
Проблема именно в установке атрибутов (вариант с setAttribute(name, val) также безрезультатный) - и первый, и второй вариант работает в IE-подобных, но почему-то напрочь отказывается работать в FF.
Тут еще, кстати, попутно встает небольшой вопросик с возвращением значения. Типа return false браузером интерпретируется как возвращение false, хотя на самом деле это должно бы значить что возвращаться не должно ничего. Я помню, была у меня функция для свертывания списка - так там без return false выдавалась ошибка, а тут - наоборот. Может кто-нибудь это объяснить? Признателен за помощь smile .

2) Касается функции ApplyHandler(o, e, f), честно позаимствованной у AKS wink

function applyHandler(o, e, f) {
  e = (e instanceof Array) ? (arguments.callee(o, e[1], f), e[0]) : e;
  return (o.attachEvent) ? o.attachEvent(e, f) : (o.addEventListener) ?
    o.addEventListener(e.substr(2), f, false) : false;
}

Так, насколько я понял, о - это необх. объект, e - это массив с событиями и f - функция-обработчик события. То есть в простейшем случае, например для отслеживания щелчка и смены стиля, это будет выглядеть таким образом:

var obj=document.getElementById("...");
function handle(x)
{
    if (x.style.borderColor="#FF0000") { x.style.borderColor="#0000FF"; }
    else { x.style.borderColor="#FF0000"; }
    return false;
}
и далее просто вызываем applyHandler(obj, "onclick", handle(obj)) ? Или сначала нужно применить эту функцию к объекту window?..

Отредактированно Варяг (26.10.2010 16:12)

Нет на форуме

 

#2 26.10.2010 16:54

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

Варяг
Я пока только по второму вопросу отвечу.
Касательно функции applyHandler - предлагаю использовать Вам ее короткий вариант:

Код:

function applyHandler(o, e, f) {
  return (o.attachEvent) ? o.attachEvent(e, f) : (o.addEventListener) ?
    o.addEventListener(e.substr(2), f, false) : false;
}

Далее о вашей handle. Довольно удобно использовать объект Event, который при таком подходе автоматически передается в функцию первым параметром:

Код:

function handle(e) {
  var el = e.target || e.srcElement;
  if (el.style.borderColor = "#FF0000")
    el.style.borderColor = "#0000FF";
  else el.style.borderColor = "#FF0000";
  return (e.preventDefault) ? e.preventDefault() : e.returnValue = false;
}

Ну а инициализация начинается конечно с window:

Код:

applyHandler(window, 'onload', function() {
  applyHandler(document.getElementById(someID), 'onclick', handle);
});

Нет на форуме

 

#3 27.10.2010 02:55

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

AKS, спасибо за ответ.
Но срабатывает почему-то только один раз, т.е. меняет на цвет синий и все.
Далее при введении массива событий, например тот же onmouseover и onmouseout вообще молчание. Можно ли поподробнее об алгоритме?
Что касается атрибутов (к первому вопросу) - может попробовать через узлы?

Отредактированно Варяг (27.10.2010 03:07)

Нет на форуме

 

#4 27.10.2010 08:52

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

Варяг

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

Потому, что условие неверно записано:

Код:

if (el.style.borderColor = "#FF0000")

Нужен оператор сравнения ==, или строгого сравнения ===, вместо оператора присвоения =. Я вчера этого сразу не заметил.

А что за "введении массива событий"?

Нет на форуме

 

#5 27.10.2010 17:19

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

А, ну конечно. Тем не менее почему-то это не меняет дела sad .
Про массив событий я имел ввиду как было в Вашем коде - applyHandler(c, ['onmouseover', 'onmouseout'], scrollControl);

Код:






{%title%}

jbferjbfrhj

Отредактированно Варяг (27.10.2010 17:38)

Нет на форуме

 

#6 27.10.2010 17:34

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

почему-то это не меняет дела

Попробуйте писать значение цвета маленькими буквами и цифрами.
По массиву понятно. Про алгоритм там нечего рассказывать - для двух обработчиков регистрируется одна и та же функция, которая в зависимости от события выполняет те или иные действия. А Вы писали "молчание" - это где, в моем сценарии?

Отредактированно AKS (27.10.2010 17:35)

Нет на форуме

 

#7 27.10.2010 17:45

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

И правда, помогло! Вот как всегда проблема в ерунде. Не понятно только чем ему регистр не понравился - я всегда так пишу. Что касается "молчания" и ['onmouseover', 'onmouseout'] - да, тут работает только оригинальный (т.е. более длинный) вариант applyHandler'a. Я думал они у Вас идентичные. В любом случае большое спасибо за помощь! smile

Нет на форуме

 

#8 27.10.2010 17:45

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

Понятно, Вам нужно менять цвет шрифта при наведении курсора и наоборот.
Тогда берите функцию addHandler в ее первоначальном виде, и пишите в вызове:

Код:

applyHandler(window, 'onload', function() {
  applyHandler(document.getElementById('subcat1'), ['onmouseover', 'onmouseout'], handle);
});

И в функции handle строка, начинающаяся с оператора return лишняя.

Нет на форуме

 

#9 27.10.2010 17:47

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

тут работает только оригинальный (т.е. более длинный) вариант applyHandler'a

Работает и та, и другая функции...

Нет на форуме

 

#10 27.10.2010 17:53

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

Изначально проблема была в отлавливании событий, потому как не хотелось засирать код атрибутами, исключенными из спецификации xhtml 1.1...

Отредактированно Варяг (29.10.2010 02:47)

Нет на форуме

 

#11 29.10.2010 02:47

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

Я, конечно, извиняюсь за надоедливость - просто не понимаю как можно отлаживать один скрипт под десять обработчиков, которые по разному его интерпретируют. Укороченная applyHandler перестает работать при вызове ее с параметрами ['onmouseover', 'onmouseout'], в то время как первый ее вариант работает и так и при передаче 'onclick'. Что касается FF, то это чудо программерской мысли почему-то если и реагирует на событие, то только один раз ( .

Нет на форуме

 

#12 29.10.2010 09:18

AKS
Опытный
Зарегистрирован: 25.12.2009
Сообщений: 409

Re: Несколько вопросов

Варяг

...просто не понимаю

Я тоже не все сразу начал понимать, но уделив javascript не месяц, и не два, начал все понимать ровно настолько, насколько требуется, чтобы все работало...

Нет на форуме

 

#13 02.11.2010 01:05

Варяг
Новичок
Откуда: Москва
Зарегистрирован: 26.10.2010
Сообщений: 18
Вебсайт

Re: Несколько вопросов

AKS, большое спасибо за хелп. Наконец нашел полноценный ресурс (quirksmode.org) - буду заполнять пробелы.

Отредактированно Варяг (02.11.2010 01:07)

Нет на форуме

 

Board footer