Порядок выполнения 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. После этого конечно ничего на экране правельного не показывается. Спасибо. |
Цитата:
|
А мы ещё над индийскими программерами смеёмся...
|
http://bash.org.ru/quote/354952
thisForm.submit(); top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV'; не делай так - либо сразу отправляй форму куда нужно, либо на сервере перенаправляй куда нужно |
Спасибо за комментарии. И все же почему только в Opera
это выполняется первое: top.top1.location = 'http://localhost/IB/top.jsp?lang-id=LV'; а это вторым: thisForm.submit(); когда в функции они стоят наоборот. |
потому что эти действия скорее всего выполняются после завершения функции - оба подразумевают, что после выполнения функции ничего на этой страничке выполнятся уже не будет, может разве что обработчик window.unload. Как такая ситуация должна рарзруливаться нигде не описано, а у Opera видимо другие приоритеты, возможно это какая-то оптимизация.
А в Opera оба действия выполняются, только в другой последовательности? И вообще что именно происходит по щелчку на ссылке? зачем отправка формы и перенаправление? |
Привет.
Там ситуация такая: Есть 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 т.е. изменение экрана, но оно соответственно уже у пользователя не отображается. |
я бы отправлял на сервер информацию с помощью ajax, а при получении ответа менял содержимое нужного фрейма
p.s. использование фреймов очень редко оправдано |
спасибо за информацию.
|
Часовой пояс GMT +3, время: 05:47. |