Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Порядок выполнения JS в Opera (https://javascript.ru/forum/misc/2676-poryadok-vypolneniya-js-v-opera.html)

Armagid 30.01.2009 15:43

Порядок выполнения JS в Opera
 
Привет всем. Кто может помочь с такой проблемой:

Есть функция:

function setInnerPage(){
if("AccountsCloseList" != "AccountStatus"){
var thisForm = document.forms[0];
var el = document.createElement("input");
el.type = "hidden";
el.name = "uri";
el.value = "AccountStatus";
thisForm.appendChild(el);
thisForm.submit();
top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV';
}
return false;
}


Ее вызывает:

<a href="#" onClick="javascript: setInnerPage(); return false;">
<img id="ge" src="http://localhost:80/banners/2.jpg" border="0" />
</a>


В IE и Firefox все работает, т.е при нажатии по картинке вызывается
setInnerPage(), происходит submit(), при этом на сервере выполняются нужные действия. Потом при "top.top1.location = '....'" показывается нужная информация. В Opera такое ощущение, что сначала срабатывает
"top.top1.location = '....'", что стоит в конце функции, а потом submit. После этого конечно ничего на экране правельного не показывается.

Спасибо.

Kolyaj 30.01.2009 15:59

Цитата:

Сообщение от Armagid
if("AccountsCloseList" != "AccountStatus")

Жесть.

ZoNT 30.01.2009 16:32

А мы ещё над индийскими программерами смеёмся...

x-yuri 31.01.2009 08:43

http://bash.org.ru/quote/354952

thisForm.submit();
top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV';

не делай так - либо сразу отправляй форму куда нужно, либо на сервере перенаправляй куда нужно

Armagid 02.02.2009 18:50

Спасибо за комментарии. И все же почему только в Opera

это выполняется первое:
top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV';

а это вторым:
thisForm.submit();

когда в функции они стоят наоборот.

x-yuri 02.02.2009 19:02

потому что эти действия скорее всего выполняются после завершения функции - оба подразумевают, что после выполнения функции ничего на этой страничке выполнятся уже не будет, может разве что обработчик window.unload. Как такая ситуация должна рарзруливаться нигде не описано, а у Opera видимо другие приоритеты, возможно это какая-то оптимизация.

А в Opera оба действия выполняются, только в другой последовательности?

И вообще что именно происходит по щелчку на ссылке? зачем отправка формы и перенаправление?

Armagid 03.02.2009 11:46

Привет.
Там ситуация такая:
Есть frameset:
<frameset border="0" rows=" 93 ,*,35"
onUnLoad="return parent.checkupdate();"
>
<frame name="top1" scrolling="no" target="contents" src="http://localhost/IB/top.jsp?lang-id=LV" marginwidth="0" marginheight="0" />

<frameset cols="150,*" border="0">
<frame name="contents" target="main" src="http://localhost/IB/menu.jsp?lang-id=LV" scrolling="no" marginwidth="0" marginheight="0" />
<frameset rows="*,125" border="0">

<frame name="main" src="http://localhost/IB/servlet/AccountsList?lang-id=LV" scrolling="auto" target="_self" marginwidth="0" marginheight="0" />

<frame name="banner" src="http://localhost/IB/banners.jsp?lang-id=LV" scrolling="no" marginwidth="0" marginheight="0" border="0"/>
</frameset>
</frameset>

<frame name="bottom" scrolling="no" target="contents" src="http://localhost/IB/bottom.jsp?lang-id=LV" marginwidth="0" marginheight="0" />
</frameset>

В frame name="top" показываются верхние менюшки выбора
В frame name="contents" показываются слева тоже менюшки выбора, соответствующие верхнему выбору.
В frame name="main" показывается содержание страницы соответствующее левому выбору.
В frame name="banner" показывается картинка т.е. рекламный банер. На каждую менюшку, что с лева свой банер. Когда я кликаю по банеру, то
я должен перейти с одной левой менюшки на следующую.

Идея такая, что при клике по банеру я на сервер посылаю uri="screen_name" (это когда thisForm.submit();)
Сервер получая имя экрана на который он должен переключится меняет
свой внутрений framework на этот новый screen_name. Но у пользователя еще висит старое состояние всех frames. Когда происходит
это:
top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV';

то верхий frame заново запрашивает свою страницу, т.е. если внутренний серверный framrwork имеет для frame="top" новое состояние оно отобразится. Далее верхний frame вызывает таким же способом:

top.contents.location = 'http://localhost/IB/menu.jsp?lang-id=LV';
новое состояние левого фрейма. Т.е. переключились на новый экран.

Т.е.:
В IE и Mozila:
1. Сначало сервер получая при "thisForm.submit();" изменяет внутренний framrwork на другой экран.
2. Потом запрашивается
top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV';
когда рефрешится верхний фрейм, это вызывает вызов такой же команды для левого фрейма, т.е. рефрешится левый фрейм.
Т.е. работает.

В Opera иногда срабатывает правильно. Но чаще сначало пункт 2. т.е. рефреш. А потом пункт 1 т.е. изменение экрана, но оно соответственно уже у пользователя не отображается.

x-yuri 03.02.2009 14:45

я бы отправлял на сервер информацию с помощью ajax, а при получении ответа менял содержимое нужного фрейма
p.s. использование фреймов очень редко оправдано

Armagid 03.02.2009 15:06

спасибо за информацию.


Часовой пояс GMT +3, время: 05:47.