Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > event передать через функцию


Автор: bars80080 13.11.2009, 15:04
что-то не получается передать event в ФФ

весь процесс выглядит так:
ищу нужные элементы, назначаю им обработчики на разные события. в некоторых случаях надо получить координаты мыши

Код

    for(var i = 0; i < ell; i++) {
        if(el[i].className != 'ihint') { continue; }
        el[i].onmouseover = function() { ihint_over(this); };
        el[i].onmousemove = function() { ihint_move(event); };
        el[i].onmouseout = function() { ihint_out(this); };
    }

во-первых, уже здесь не получается отдать event в функцию ihint_move

во-вторых, даже если просто прописать в тэге <img onmousemove="func1(event);" />,
то не получается передать событие в следующую функцию:

Код

function func1(e) {
    func2(e);
}
в func2() события ФФ тоже не видит

Автор: Amphiluke 13.11.2009, 19:31
Видимо, не стóит так определять слушателей событий. Пользуйтесь стандартными методами DOM (AddEventListener), они точно не подведут.

Автор: bars80080 13.11.2009, 19:59
Цитата(Amphiluke @  13.11.2009,  18:31 Найти цитируемый пост)
Пользуйтесь стандартными методами DOM (AddEventListener),

что сие подразумевает?

Добавлено через 3 минуты и 18 секунд
это?

Код

    for(var i = 0; i < ell; i++) {
        if(el[i].className != 'ihint') { continue; }
        el[i].onmouseover = function() { ihint_over(this); };
        el[i].addEventListener('mousemove', 'ihint_move', false);
        el[i].onmouseout = function() { ihint_out(this); };
    }


а где ж тут event? или он дефолтно встроен?

Автор: Amphiluke 13.11.2009, 20:13
Да, он передается неявно. Но функция должна принимать соответствующий параметр.

Код

function ihint_move(evnt) {
   // ...
}

if (el[i].addEventListener) {
   el[i].addEventListener("mousemove", ihint_move, false);
} else {
   el[i].attachEvent("onmousemove", ihint_move);
}

Автор: youri 14.11.2009, 01:47
bars80080, ie хранит этот объект в window, т.е. можно просто писать event
ff передает его через первый параметр
кроссбраузерно получить его можно так
Код

function f( e ) {

    e = e || event;
    ...
}

в html, если очень хочеться, можно сделать так
Код

... onclick="f( argoments[0] || event );" ...

Автор: bars80080 14.11.2009, 12:33
youri, я это знаю. я говорю о передаче event через две функции


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

Автор: youri 16.11.2009, 00:28
значит знаешь, но не понимаешь (;
Цитата(bars80080 @  13.11.2009,  15:04 Найти цитируемый пост)
        el[i].onmousemove = function() { ihint_move(event); };

Цитата(bars80080 @  13.11.2009,  15:04 Найти цитируемый пост)
во-вторых, даже если просто прописать в тэге <img onmousemove="func1(event);" />,

где ты тут передаешь первый параметр обработчика события? В обоих случаях ты передаешь window.event

Автор: bars80080 16.11.2009, 12:12
ну, что-то я не догоняю, это стопудово. 

вот сейчас работает так:
Код

<html>
<body>
<style>
#a2 { width: 400px; height: 300px; background: #eeeeee; }
</style>
<script>
var IE = false, IE6 = false, IE7 = false;
if(window.ActiveXObject) {
    IE = true;
    var uaVers = window.navigator.userAgent.substr(window.navigator.userAgent.indexOf('MSIE') + 5, 3);
    if(uaVers.slice(0, 1) == 6) { IE6 = true; }
    else { IE7 = true; }
}
window.onload = function() { set1(); };
function set1() {
    var el = document.getElementById('a2');
    if(el.addEventListener) {
        el.addEventListener("mousemove", hand2, false);
    } else {
        el.attachEvent("onmousemove", hand2);
    }
}
function hand2(e) {
    var bk = document.getElementById('a1');
    bk.innerHTML = xmouse(e);
}
function xmouse(e) { if(IE) { return event.clientX; } else { return e.pageX; }}
</script>
<span id="a1"></span>
<br />
<div id="a2"></div>
</body></html>


вопрос теперь такой. как мне назначить this в функцию?
то есть, здесь один див, но в оригинали их несколько. операцию нужно будет совершать с ними и для этого подходило
<div onmousemove="hand2(event, this);">

но как это сделать с назначаемым обработчиком?
Код

function set1() {
    var el = document.getElementById('a2');
    if(el.addEventListener) {
        el.addEventListener("mousemove", hand2, false, this);
    } else {
        el.attachEvent("onmousemove", hand2, this);
    }
}
function hand2(e, x) {
    x.innerHTML = xmouse(e);
}
понятное дело не работает

Автор: Itsys 16.11.2009, 13:17
Можно так:
Код

<html>
<body>
<style>
#a2 { width: 400px; height: 300px; background: #eeeeee; }
#a3 { width: 400px; height: 300px; background: red; }
</style>
<script>
var IE = false, IE6 = false, IE7 = false;
if(window.ActiveXObject) {
    IE = true;
    var uaVers = window.navigator.userAgent.substr(window.navigator.userAgent.indexOf('MSIE') + 5, 3);
    if(uaVers.slice(0, 1) == 6) { IE6 = true; }
    else { IE7 = true; }
}
window.onload = function() { set1(); };
function set1() {
    var el = document.getElementById('a2');
    (function(el){
    if(el.addEventListener) {
        el.addEventListener("mousemove", function(e){hand2(e, el)}, false);
    } else {
        el.attachEvent("onmousemove", function(e){hand2(e, el)});
    }
    })(el);
    el = document.getElementById('a3');
    (function(el){
    if(el.addEventListener) {
        el.addEventListener("mousemove", function(e){hand2(e, el)}, false);
    } else {
        el.attachEvent("onmousemove", function(e){hand2(e, el)});
    }
    })(el);
}
function hand2(e, el) {
    var bk = document.getElementById('a1');
    bk.innerHTML = "el: " + el.id + "x: " + xmouse(e);
}
function xmouse(e) { if(IE) { return event.clientX; } else { return e.pageX; }}
</script>
<span id="a1"></span>
<br />
<div id="a2"></div>
<div id="a3"></div>
</body></html>

Автор: bars80080 16.11.2009, 14:07
да, до такого бы я не догадался

таким макаром код в первом посте преобразовался к следующему виду:

Код

    if(ell < 1) { return false; }
    if(el[0].addEventListener) {
        for(var i = 0; i < ell; i++) {
            if(el[i].className != 'ihint') { continue; }
            el[i].onmouseout = function() { ihint_out(); };
            (function(my) {
                my.addEventListener("mouseover", function(e){ ihint_over(e, my) }, false);
                my.addEventListener("mousemove", function(e){ ihint_move(e) }, false);
            })(el[i]);
        }
    } else {
        for(var i = 0; i < ell; i++) {
            if(el[i].className != 'ihint') { continue; }
            el[i].onmouseout = function() { ihint_out(this); };
            (function(my) {
                my.attachEvent("onmouseover", function(e){ ihint_over(e, my) });
                my.attachEvent("onmousemove", function(e){ ihint_move(e) });
            })(el[i]);
        }
    }

всем спасибо


кстати, заметно что ИЕ в случае перемещения отрабатывает быстрее, чем ФФ, опера и хром

Автор: brother79 17.11.2009, 13:17
В твоём примере не понятно:

1) откуда вообще берётся Event может он просто недоступен из этой ф-ии, надо знать где он определяется и откуда он видимый?
2) 

Цитата(bars80080 @  13.11.2009,  15:04 Найти цитируемый пост)
во-первых, уже здесь не получается отдать event в функцию ihint_move

во-вторых, даже если просто прописать в тэге <img onmousemove="func1(event);" />,
то не получается передать событие в следующую функцию:


Что понимается под "не получается"? 

попробый в ф-ии написать alert(event), посмотри что браузер скажет? Даже если у тебя это ф-я, он должен её показать как ф-ю.

Автор: bars80080 17.11.2009, 16:45
brother79, уже всё решено. код из первого поста заменил последний

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)