Как вылечить фокус в Опере?

ss25_satana

Новичок
Как вылечить фокус в Опере?

Шаблон в Смарти
PHP:
<!-- Начало add.tpl -->
<b>&nbsp;»&nbsp;<a href="{$BACK_URL}">{$BACK}</a></b>
<br /><br />

<table border="1" cellPadding="1" cellSpacing="1" width="600px" class="forma" align="center">
<form id="Add" action="{$FORM_URL}" method="POST">
	<tr>
		<td colspan="2" class="forma_header">{$ORDER_NEW}</td>
	</tr>
	<tr>
		<td class="forma_left">{$ORDER_BARCODE}:</td>
		<td class="forma_right"><input id="inv" type="text" name="inv" class="forma_input" ></td>
	</tr>
	<tr>
		<td colspan="2" class="forma_footer"><input type="submit" value="{$ADD}" name="add" class="forma_submit"></td>
	</tr>
</form>
</table>

<script type="text/javascript">
  if(document.getElementById('inv')) document.getElementById('inv').focus();
 </script>

<!-- Конец add.tpl -->
В ИЕ 8 пр загрузке на поле ввода стает фокус а в Опере 10 нет

Информация о версии
Версия: 10.00
Сборка: 1750
Платформа: Win32
Система: Windows XP
Версия Java: Java не установлен
Модуль XHTML+Voice: Плагин не загружен
Вставлять в боди просьба непредлогать
 

dimagolov

Новичок
PHP:
function setFocus() {
   if(document.getElementById('inv'))
      document.getElementById('inv').focus();
   else
      setTimeout(setFocus, 500);
}
setFocus();
 

Wicked

Новичок
эээ...
PHP:
function setFocus() {
   if(document.getElementById('inv'))
      document.getElementById('inv').focus();
   else
      setTimeout(setFocus, 500);
}
setFocus();
меняется на
PHP:
document.observe('dom:loaded', function() {
  $('inv').focus();
});
или я чего-то не понимаю?
 

dimagolov

Новичок
Wicked, это требует наличия фреймворка.
написал бы
PHP:
function setFocus() {
	document.getElementById('inv').focus();
}
if (document.body.addEventListener)
	document.body.addEventListener('load', setFocus, false);
else if (document.body.attachEvent) {
	try {
		document.body.attachEvent('onload', setFocus);
	} catch (aEx) {}
}
 

Wicked

Новичок
dimagolov
я просто не понял, почему пришлось бы "править шаблон body"
 

dimagolov

Новичок
Wicked, я обычно такие обработчики вешаю более консервативно, в теге body, вот и написал. обычно там у меня вся необходимая инициализация JS объектов.
 

Crys

Двинутый новичок
*либо кто-то путает body c head, либо я что-то не понимаю*
 

Crys

Двинутый новичок
Crys, я про

<body onload='initJS()'>
Это я еще более не пониманию. Какой смысл назначать событие domready по выполнению onload, если domready выполняется раньше onload? Или я опять чего-то не понимаю?
 

dimagolov

Новичок
Crys, никто не назначает domready по выполнению onload. просто Wicked пользует domready, а я по-старинке onload для одного и того же: поставить фокус на input.

Или ты хочешь сказать что фокус может и не получиться по событию domready?
 

Crys

Двинутый новичок
Бррр.. Перечитал топик, вообще запутался...
В общем, если не надо править body - можно править head
Нелья head - правим что угодно с добавлением domready/onload
Нельзя пользоваться фреймворками - пользуемся чистым JavaScript'ом (или тысячами другими способами)

Имхо, финиш.
dimagolov, неправильно понял сразу, что ты имел ввиду.. Но все-равно в данном случае лучше вешать событие на domready, чем на onload. Разницы в затратах практически никакой, а решение более универсальное (не ожидается загрузка тех же картинок).

-~{}~ 20.10.09 00:28:

Или ты хочешь сказать что фокус может и не получиться по событию domready?
И по domready и по onload получится, естественно..
 

Crys

Двинутый новичок
кстати, это не столь очевидно. если элемент невидим (скрыт) на странице, то focus() даст ошибку.
а) только в IE (возможно, ошибаюсь)
б) а зачем делать фокус скрытому элементу?

-~{}~ 20.10.09 02:49:

но вообще про такую "фичу" не знал... спасибо за то, что просветил :)
 

dimagolov

Новичок
б) а зачем делать фокус скрытому элементу?
ежу ясно что не за чем, но когда фокусировка и сокрытие/показ происходят асинхронно, то всякое может случиться. я обарачиваю у себя все конструкции с focus() в try {} catch {}, чтобы скрипт хотя бы не выбрасывал ошибок (это в дополнение к тому, что стараюсь чтобы такого вообще не происходило)
 
Сверху