Сайты - по стандартам, но не стандартные сайты!
Приветствую, коллеги
Столкнулся с некоторыми трудностями в, казалось бы, совсем несложных скриптах
Трудности следующие:
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 выдавалась ошибка, а тут - наоборот. Может кто-нибудь это объяснить? Признателен за помощь .
2) Касается функции ApplyHandler(o, e, f), честно позаимствованной у AKS
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)
Нет на форуме
Варяг
Я пока только по второму вопросу отвечу.
Касательно функции 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); });
Нет на форуме
AKS, спасибо за ответ.
Но срабатывает почему-то только один раз, т.е. меняет на цвет синий и все.
Далее при введении массива событий, например тот же onmouseover и onmouseout вообще молчание. Можно ли поподробнее об алгоритме?
Что касается атрибутов (к первому вопросу) - может попробовать через узлы?
Отредактированно Варяг (27.10.2010 03:07)
Нет на форуме
Варяг
Но срабатывает почему-то только один раз, т.е. меняет на цвет синий и все.
Потому, что условие неверно записано:
if (el.style.borderColor = "#FF0000")
Нужен оператор сравнения ==, или строгого сравнения ===, вместо оператора присвоения =. Я вчера этого сразу не заметил.
А что за "введении массива событий"?
Нет на форуме
А, ну конечно. Тем не менее почему-то это не меняет дела .
Про массив событий я имел ввиду как было в Вашем коде - applyHandler(c, ['onmouseover', 'onmouseout'], scrollControl);
{%title%} jbferjbfrhj
Отредактированно Варяг (27.10.2010 17:38)
Нет на форуме
почему-то это не меняет дела
Попробуйте писать значение цвета маленькими буквами и цифрами.
По массиву понятно. Про алгоритм там нечего рассказывать - для двух обработчиков регистрируется одна и та же функция, которая в зависимости от события выполняет те или иные действия. А Вы писали "молчание" - это где, в моем сценарии?
Отредактированно AKS (27.10.2010 17:35)
Нет на форуме
И правда, помогло! Вот как всегда проблема в ерунде. Не понятно только чем ему регистр не понравился - я всегда так пишу. Что касается "молчания" и ['onmouseover', 'onmouseout'] - да, тут работает только оригинальный (т.е. более длинный) вариант applyHandler'a. Я думал они у Вас идентичные. В любом случае большое спасибо за помощь!
Нет на форуме
Понятно, Вам нужно менять цвет шрифта при наведении курсора и наоборот.
Тогда берите функцию addHandler в ее первоначальном виде, и пишите в вызове:
applyHandler(window, 'onload', function() { applyHandler(document.getElementById('subcat1'), ['onmouseover', 'onmouseout'], handle); });
И в функции handle строка, начинающаяся с оператора return лишняя.
Нет на форуме
тут работает только оригинальный (т.е. более длинный) вариант applyHandler'a
Работает и та, и другая функции...
Нет на форуме
Изначально проблема была в отлавливании событий, потому как не хотелось засирать код атрибутами, исключенными из спецификации xhtml 1.1...
Отредактированно Варяг (29.10.2010 02:47)
Нет на форуме
Я, конечно, извиняюсь за надоедливость - просто не понимаю как можно отлаживать один скрипт под десять обработчиков, которые по разному его интерпретируют. Укороченная applyHandler перестает работать при вызове ее с параметрами ['onmouseover', 'onmouseout'], в то время как первый ее вариант работает и так и при передаче 'onclick'. Что касается FF, то это чудо программерской мысли почему-то если и реагирует на событие, то только один раз ( .
Нет на форуме
Варяг
...просто не понимаю
Я тоже не все сразу начал понимать, но уделив javascript не месяц, и не два, начал все понимать ровно настолько, насколько требуется, чтобы все работало...
Нет на форуме
AKS, большое спасибо за хелп. Наконец нашел полноценный ресурс (quirksmode.org) - буду заполнять пробелы.
Отредактированно Варяг (02.11.2010 01:07)
Нет на форуме