LINUX.ORG.RU

Не работает метод focus на странице с якорем в URL

 ,


2

1

Сабж. Например, есть страница /page с якорем #anchor и формой, на которой при загрузке страницы отрабатывает метод focus для одного из элементов формы. Если URL страницы /page — то всё работает как задумано, но если в URL написать /page#anchor, то focus не срабатывает. Можно ли их как-нибудь подружить?

man focus. Якорь и говорит что фокус надо поставить на тот элемент. У тебя что-то архитектурно не так если тебе фокус сразу на два элемента надо.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Фокус нужно ставить только на один элемент формы. Но ведь focus, как и весь остальной яваскрипт, должен срабатывать уже после якоря (плюс учитывая то, что якорь находится выше формы), разве нет?

wintrolls ☆☆
() автор топика
Последнее исправление: wintrolls (всего исправлений: 3)
Ответ на: комментарий от wintrolls

должен срабатывать уже после якоря

Ну это смотря как напишешь, когда ты вызываешь .focus()? Кстати, от якоря нельзя избавиться? Фокус всё равно проскроллит к инпуту.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Ну это смотря как напишешь, когда ты вызываешь .focus()?

focus вызываю уже после формы. Т.е. что-то типа такого:

<a name="anchor"></a>
<form><input id="id" type="text"></form>
…
<script type="text/javascript">document.getElementById('id').focus();</script>

wintrolls ☆☆
() автор топика

погугли какие там есть события, типа window.onload или document.onload ну и нечто подобное, и посади на них функцию с вызовом focus'a. короче вот такой код засовывай в head

if (window.attachEvent)
{
  window.attachEvent('onload', your_function);
}
else if (window.addEventListener)
{
  window.addEventListener('load', your_function, false);
}
else
{
  document.addEventListener('load', your_function, false);
} 

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от wintrolls

А надо как тут

Соответственно, проще всего взять какой-нибудь jQuery, где кроссбраузерня сделана за тебя.

GateKeeper ★★
()
Ответ на: комментарий от Bad_ptr

Потом из-за таких как ты с if (window.attachEvent) первым появляются стенания «Опира не работает, а-а-а!!11» :}

Deleted
()
Ответ на: комментарий от Bad_ptr

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

Deleted
()
Ответ на: комментарий от wintrolls

Не надо так делать. И эта строчка тут вызывается до того как страница прогрузилась (хотя может и нет). Почитай про события и их обработчики, в частности про load и DOMContentReady.

Kalashnikov ★★★
()
Ответ на: комментарий от Deleted

Кстати, что интересно, проблема в стартовом посте в опере не проявляется, т.е. там всё работает как надо.

wintrolls ☆☆
() автор топика
Ответ на: комментарий от wintrolls

А может свойство autofocus поможет?

Deleted
()

Похоже я нашёл нужное решение:

<span id="anchor"></span><noscript><a name="anchor"></a></noscript>
<script type="text/javascript">
	<!--
		window.onload = function()
			{
			document.getElementById('anchor').scrollIntoView();
			};
	//-->
</script>

wintrolls ☆☆
() автор топика
Последнее исправление: wintrolls (всего исправлений: 1)
Ответ на: комментарий от GateKeeper

А вот, кстати, скажи, зачем жабаскрипт внутри тега обрамляют в XML-комментарий?

Чтобы доисторические браузеры не показывали сорцы скрипта если <script> не поддерживается.

wintrolls ☆☆
() автор топика
Последнее исправление: wintrolls (всего исправлений: 1)
Ответ на: комментарий от wintrolls

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

fixed.

Года три как перестал так делать.

zz ★★★★
()
Ответ на: комментарий от wintrolls

А почему и нет. А ну потом добавить захочешь ещё чего-нибудь :) Заодно и про <!-- думать не надо.

Deleted
()
Ответ на: комментарий от wintrolls

Привычка

Ты хочешь сказать что ты уже давно пишешь на жс? Если так, у меня для тебя плохие новости.

Избавляйся от этих страшных атавизмов (от .onload = function() ... тоже)

Kalashnikov ★★★
()
Ответ на: комментарий от Deleted

А почему и нет. А ну потом добавить захочешь ещё чего-нибудь :)

Так никто же не запрещает вынести после таких добавлений если они когда-нибудь будут, учитывая что это делается полностью прозрачно и ничего потом не поломается. А пока что для кода в пару строчек, который используется только на этой страничке и нигде больше, вынесение в отдельный файл, в результате которого увеличится время и количество запросов к серверу (ведь проще отдать один большой файл чем несколько мелких), не считаю целесообразным.

Заодно и про <!-- думать не надо.

Я и не думаю, просто на автомате пишу.

wintrolls ☆☆
() автор топика
Ответ на: комментарий от wintrolls

ведь проще отдать один большой файл чем несколько мелких

К нам приходит браузерное кэширование. Поприветствуем!

Deleted
()
Ответ на: комментарий от Kalashnikov

Ты хочешь сказать что ты уже давно пишешь на жс?

Относительно недавно, просто быстро привыкаю.

от .onload = function() ... тоже

А чем это плохо?

wintrolls ☆☆
() автор топика
Ответ на: комментарий от Deleted

Кэш не вечный же. К тому же, при доработках проще потом оперировать с одним целостным файлом чем с кучей мелких. В общем, я за разумный подход в зависимости от ситуации: если кода много, то удобно его выносить во внешний файл, а иногда и несколько, но если его мало — это к какой-либо ощутимой пользе не приведёт.

wintrolls ☆☆
() автор топика
Ответ на: комментарий от dismal_faun

А еще за такие отступы в коде некоторые люди бьют гриндерами по лицу.

А что в них не так? Вполне нормальный стиль, не?

wintrolls ☆☆
() автор топика
Ответ на: комментарий от dismal_faun

А у тебя табуляция и Whithesmith.

И что в этом плохого?

Нормальный это вот например.

(function() {
  // Some initialization code wrapped in a function to create a scope for locals.
})();

Винегрет из скобок очень хорошо влияет на читабельность, да. Ну и конечно же, миллионы мух гугол не может ошибаться.

wintrolls ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.