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


Автор: Иван FXS 1.4.2004, 19:05
Здравствуйте!
У меня есть окно с двумя фреймами, в одном из них - "дочернем" - я хочу открывать ДЛЯ ПРОСМОТРА некоторый ВНЕШНИЙ html-документ ...
Где мне следует поместить код функции обработки события, например:
function myOnMouseMove(){
clientX = window.event.clientX
clientY = window.event.clientY
s="(" + clientX + "," + clientY + " ) "
window.status = s
}
и операцию активирования этого обработчика, например:
onmousemove="myOnMouseMove()"

- чтобы это событие возникало (и обрабатывалось) также и на/в "дочернем" фрейме?

НП, Иван FXS.

Автор: Royan 3.4.2004, 16:04
Все просто раз есть фрймы значит есть и такое понятие как обект фрейма. Пусть в моем случае твой код располагается в фрейме, что находится слева, а присобачить обработку движения мыши нужно еще и к тому что с лева. Соответственно есть один корневой фрейм, который описывает frameset. Из любого фрейма достать соседний можно так: top.left[somthing] или top.right[something] (опять же предполагается что left и right это имено левого и правого фреймов соответственно). Это означает что нам осталось распространить влияние твоей функции на правый фрейм. Делаем следующее:
Код
<script LANGUAGE="JScript">
attachEvent ('onmousemove', top.right.myOnMouseMove);
</sctipt>

и всего делов. Можно написать что -то вроде деструктора скрещенного со сборщиком мусора, чтобы "почистить" за собой и освободить память, тогда приведенный выше код измениться следующим образом::
Код
<PUBLIC:ATTACH EVENT="ondetach" ONEVENT="cleanup()" />

<script LANGUAGE="JScript">
attachEvent ('onmousemove', top.right.myOnMouseMove);
function cleanup()
{
  detachEvent ('onmousemove', top.right.myOnMouseMove);
}
</sctipt>

Подразумевается, что мы все любим и пользуемся Internet Explorer 5 и выше ;)

Автор: Sardar 4.4.2004, 02:30
Ну не так трагично это все.... smile.gif
Если честно, то я не понял в чем проблема. Если ты можешь редактировать загружаемую страницу, то допиши туда код который будет вызывать функции из другого фрейма.
Иначе перепиши обработчиков событий конкретного фрейма:
Код

//right.htm
<script language="Javascript" type="text/javascript">
<!--
function movemy(x,y) {
document.getElementById('test').innerHTML="X: "+x+"Y: "+y;
}
function movebrother(x,y) {
document.getElementById('test').innerText="br: X: "+x+"Y: "+y;
}
if(typeof(document.captureEvents)!='undefined') {
document.captureEvents(Event.MOUSEMOVE);
}
document.onmousemove=function(evn){
evn=evn==null? window.event: evn;
movemy(evn.screenX,evn.screenY);
};

if(typeof(parent.frames['right'])!='undefined') {
if(typeof(document.captureEvents)!='undefined') {
 parent.frames['right'].document.captureEvents(Event.MOUSEMOVE);
 }
parent.frames['right'].document.onmousemove=function(evn) {
 evn=(evn==null)? parent.frames['right'].event: evn;
 movebrother(evn.screenX,evn.screenY);
};
}
//-->
</script>
....
<div id="test">Test</div>

//index.htm
<frameset cols="50%,50%" border="5">
<frame name="left" src="right.htm"></frame>
<frame name="right" src="loadable_page.htm"></frame>
</frameset>

По идее код должен работать и в Мозилле(Netscape...), но наверное из-за того что у меня 1.7 Alfa или в целях безопасности Мозилла не позволяет изменять обрабтчиков событий чужого фрейма.
Для Мозиллы есть аналог IE attachEvent: addEventListener(type,handler), но я это пока не использовал.

Автор: Royan 5.4.2004, 21:22
Слудующая фраза, конечно на любителя, но если быть откровенным, то делать сайт совместимым еще и с Mozill'ой, изврат достойный только JS-guru и студентов у коих сопли всегда пузырями (пардон за прямоту) для всех остальных код для IE достаточно до зарезу.

Автор: Sardar 5.4.2004, 23:43
Интересная точка зрения... smile.gif, хотя ты не первый от кого я подобное слышу...
Мозилла крутой браузер, если бы еще интерфейс был бы поудобней, то вообще никаких претензий. Писать совместимый код между Gecko браузерами, Opera и IE довольно легко. Нетскапу кривую основанную не на Gecko(версии 4) нужно специально забыть, уж больно тупо все там сделанно, да и в 21'вом веке живем.

Автор: Royan 6.4.2004, 19:22
Sardar только без обид, smile.gif я довльно много и долго программировал на JS, и перепробовал кучу всего, и смею заметить фраза
Цитата
Писать совместимый код между Gecko браузерами, Opera и IE довольно легко.
далеко не всегда имеет место быть. Одно дело если ты пишешь по стандарту (ECMA-262) а другое ты делаешь fully functional user interface (используя DOM 1 или\и 2). Последнее чаще всего упиарется в весьма неожиданные моменты, хотя я не спорю все больше и больше вещей фиксаются. На мой взгляд самыми вопиющими были факты неверной интерпретацией XSL (правда даненько это было года 1,5 назад).

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