Отсутствует реакция в FireFox

Роберт

Аналитик
Отсутствует реакция в FireFox

Почему при получении такого кода FireFox ни как не реагирует?
Код:
<FORM id='auth' action='http://mail.ru' method=post> 
<INPUT type=hidden name=aaa value=1> 
<script>auth.submit();</script> 
</FORM>
Все остальные браузеры делают переход на сайт , а FF оставляет белый экран.
Прив name='auth' тоже самое.
 

Роберт

Аналитик
triumvirat
ну как это? потому что форма получает от скрипта команду сабмит.
любой другой браузер реагирует же.

и если внутри что-то типа
<input type=button onClick=auth.submit()>
всё работает
 

weregod

unserializer
можно без document.getElementById к объекту напрямую обращаться, а можно не напрямую
можно добавлять в DOM после анализа открывающего тега, можно после закрывающего
 

Lightning

Трудоголик
а так?
Код:
<FORM id='auth' action='http://mail.ru' method=post> 
<INPUT type=hidden name=aaa value=1> 
</FORM>
<script>auth.submit();</script>
 

Роберт

Аналитик
Lightning,
Ты же наверно перед тем как написать проверил? Так тоже не работает.


weregod,
Я не совсем понял твоей идеи , но такой вариант тоже не заставляет FF передать форму.
<script>document.getElementById('auth').submit();</script>
 

Духовность™

Продвинутый новичок
Код:
<script>auth.submit();</script>
Слушайте, а как вообще объясняется работа данного кода? Разве обращение к форме не должно производиться через коллекцию forms по старому стандарту и через getElementById по новому? Почему объект формы находится в области window? Не понятно...

Роберт
вариант предложенный Lightning как раз работает
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Роберт
<body onload="javascript:document.auth.submit();"> изменив id на name='auth' либо через библиотеки типа jquery. Там есть для этого средства.

-~{}~ 20.04.10 22:44:

AmdY
опередил)
 

Роберт

Аналитик
Спасибо обоим - c0dex и AmdY , именно по body onload у меня сейчас и работает.
Но я не могу понять почему когда передаю команду прямо от скрипта то она не выполняется?

triumvirat
У меня на FF 3.0.10 portable не работает
На другом компьютере у человека проинсталирован FF 3.6.3 и тоже не работает (просто белый лист)
И при моём варианте и при варианте Lightning , и при замене в обоих вариантах на:
<script>document.getElementById('auth').submit();</script>
 

dimagolov

Новичок
Роберт, а ты расскажи нам, ради чего тебе понадобилось автосабмитить форму JS-ом сразу после загрузки?
 

Роберт

Аналитик
dimagolov
Чтобы форма сделала POST запрос на другую страницу (а на какую - это я уже решаю в PHP в зависимости от данных)

-~{}~ 20.04.10 22:58:

triumvirat
Какая у тебя версия FireFox?
Потому что я уже дважды говорил что ни твой , ни мой вариант , ни с заменой на document.getElementById не рабоатают. А ты и тут и на том форуме говоришь что работает. С какой версии FF исправило свою ошибку?

-~{}~ 20.04.10 23:11:

triumvirat
Код:
<FORM id='auth' action='http://mail.ru' method=post>   
<INPUT type=hidden name=Login value=1>   
</FORM>  
<script>document.forms.auth.submit();</script>
Этот вариант тоже не работает.


А вот если к нему дописать DOCTYPE то уже работает. Вот такое:
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head><title>Untitled</title></head><body>  
<FORM id='auth' action='http://mail.ru' method=post>   
<INPUT type=hidden name=Login value=1>   
</FORM>  
<script>document.forms.auth.submit();</script>   
</body></html>
Значит у тебя просто в FF стоят не стандартные настройки , по этому у тебя и работало...
 

dimagolov

Новичок
Чтобы форма сделала POST запрос на другую страницу
и что будет передаваться в POST-е? незаметно для пользователя, кстати...

по теме. ты не понимаешь, что у тебя проблемы 2:
1. то, что не все браузеры и не всегда гадят в глобальное пространство имен ссылки на DOM по name или id
2. вне зависимости от того получается или нет п.1, DOM в принципе доступен (грубо говоря) после отработки события onload для страницы. А это значит, что твой код в <script> пытается найти еще не существующий элемент DOM.
 

Духовность™

Продвинутый новичок
Роберт
версия у меня 3.6.3, но о какой ошибке FF ты говоришь? код писать просто надо правильно.

Код:
<FORM id='auth' action='http://mail.ru' method=post>
 <INPUT type=hidden name=aaa value=1>
 <script>auth.submit();</script>
 </FORM>
тут ты обращаешься из JS к объекту формы, которого ещё может даже и не создано - угадать, как поведет себя интерпретатор не возможно, так как в момент обращения скрипта к форме, конечный тег формы ещё не закрыт. Обращаешься синтаксически не правильно, ни в DOM Level 1, ни в DOM Level 2 нельзя обращаться к объекту формы из глобальной области видимости, это не должно работать вообще. ну и значения атрибутов надо уже научиться закрывать кавчками.
 

Роберт

Аналитик
triumvirat
Про то что у меня скрипт в ещё не закрытой форме - да. Но меня в общем-то это никогда не волновало. Как видишь , если дописать DOCTYPE то этот скрипт будет работать как в твоём так и в моём варианте (и до и после закрытия формы). Собственно говоря , если бы это не работало то ты не виделбы web-страницы до того как браузер докачает весь html файл.
Ну а что касается "надо уже научиться закрывать кавчками" - любое предложение в русском языке должно начинаться с большой буквы. Только ты этому не следуешь. Если теоретичеки значение может оказаться разывистым - я его обязательно заключу в кавычки :)



dimagolov
и что будет передаваться в POST-е? незаметно для пользователя, кстати...
Особенно удивила твоя фраза - "...незаметно для пользователя, кстати..."
Ну раз любопытно - смотри:
Для того чтобы адрес сайта всегда оставался типа: ввв.сайт.ру , все запросы передаются только постом.
На сайте человек проходит тестирование и все его дейтвия на сайте не подразумевают использования клавиши Back.
Если он где-то и нажмёт Back то браузер перезапросит передачу формы , но человек уже ответил на вопрос и по этоу повторно на него уже не ответит.
Пользователю не обязательно проходить весь тест полностью , он может вернуться к нему в любой момент отложив работу или просто погуляв по сайту (ну скажем вдруг зайдёт в настройки , выберет там побольше шрифт , нажмёт сохранить , попадёт на главную страницу и там выберет "Продолжить последнее тестирование").
А данная промежуточная форма , которая вызвала у тебя такие подозрения в том что пользователь чего-то не видит , выполняется перед началом первого теста (чтобы для пользователя были бы сгенерированные новые тестовые вопросы).
Тоесть , человек нажимает создать новый тест , выберает раздел , потом подраздел , после выбора подраздела пользователь пересылается на форму попав на которую для него создаётся список вопросов на которые он будет отвечать , и оттуда он "незаметно" попадает на страницу самого тестирования.
Я не могу генерировать для него вопросы когда он попадает на страницу с тестами по двум причинам:
1) Если находясь на этой странице он нажмёт F5 - то они будут сгенерированы заново (ну мало ли браузер не все картинки отрисовал и пользователь нажмёт Refresh)
2) Я бы мог бы иметь какую-то переменную , если она пустая , и я попадаю в тесты , то должен создать вопросы клиенту. Но где я её могу обнулить? Только между выбором подраздела и началом тестирования (так как человек может уже и так выполняет тестирование и просто из любопытсва решил войти в раздел с подразделами чтобы посмотреть какие они есть , а потом продолжит выполнение своего ранее начатого тестирования).
Конечно , если бы можно было бы менять URL - я бы после выбора подраздела зашёл бы на генерацию вопросов и оттуда через HEADER('Location: ?...'); перенаправил его на страницу тестов , но я работаю только через POST запросы и по этому такой вариант не проходит. Итого - единственный выход отдельная форма.

Да , можно было бы всего того же добиться поставив всё в фрейм и там поднизом уже используя GET запросы.
Да , можно было бы использвать основую форму для получения post-запросов , после этого переводить все принятые значения в какой-то подраздельчик глобальных переменных и сразу же после этого делать HEADER('Location: .'); обабатывая в программе не $_POST[aaa] , а скажем $_SESSION[POST][aaa] (это даже было бы удобней так как у пользователя даже клавиша Back не загорелась бы , ведь он технически всё время находится на одной и тойже странице без изменения передаваемых данных , и никуда с неё не уходит и не передаёт параметры (так как после передачи параметров сразу переносится на себя же через хэдэр локэйшен).
Но всё это лишнее и не требуется в рамках проекта...

Самый удобный вариант - отдельная форма. Попал на неё , сгенерировал вопросы , "незаметно" перешёл на страницу тестирования...
Любопытство удовлетворено? :)
 

dimagolov

Новичок
Да , можно было бы использвать основую форму для получения post-запросов , после этого переводить все принятые значения в какой-то подраздельчик глобальных переменных и сразу же после этого делать HEADER('Location: .'); обабатывая в программе не $_POST[aaa] , а скажем $_SESSION[POST][aaa]
вообще-то все обрабатывают форму сразу, результаты обработки пишут в базу и/или в сессию и переадресовывают на страницу отображения результатов/продолжения опроса.

Но всё это лишнее и не требуется в рамках проекта...
ню-ню... китайский ты комсомолец наш :)

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

Роберт

Аналитик
Ну так уж и все обрабатывают форму , пишут результаты в сессию и переадресовывают...
По твоей логике скажем для показа списка разделов я должен вначале получить данные , обработать , сохранить в сессию информацию о том что сейчас я должен буду показывать список разделов , потом через хедер обновить станицу чтобы избавиться от постов и уже на свеженькой прочитав из сессионной переменной что я хочу показать списко разделов , выполнить это.
Мартышкин труд...
Я просто сразу читаю из POST'a что хочу выполнить и выполняю это.
В моём варианте у мен 30 .php файлов каждый из которых отвечает за свою область (логин , главное меню , выбор раздела , тестирование , форум , статистика и т.д.).
В твоём варианте их количество сразу увеличивается в 2 раза (один для обработки , после чего переадресация , и потом второй для вывода). Я уж не говорою о том что одни и теже данные могут быть необходимы как для выполнения обработки , так и для отображения , что приведёт к повторным запросам в базу данных (ну скажем вначале запрашивается вопрос для установления правильно на него ответил пользователь или нет на этапе обработки , а пото после HEADER('Location: .'); этот же вопрос ещё раз будет вызван но уже из блока отображения , чтобы показать пользователью какой же был правильный ответ у этого вопроса). Опять же ты сейчас можешь сказать что на первый раздел обработки полученной информации мы возложим функции и подгатовки вывода результата. Но тогда чего ты добился? У тебя всё-равно один блок выполняет и обработку и подготовку к показу.
Короче , бессмысленный спор. Я продумал конкретную задачу и решил что будет лучше так , а ты когда-то решал другую задачу по другому и пытаешься меня убедить что твой вариант был лучше...
 
Сверху