Firefox, имеющий "#;"в адресной строке - PullRequest
5 голосов
/ 21 июля 2011

Почему у firefox (не проверенного в другом браузере) возникают проблемы с загрузкой значений форм, когда #; находится в адресной строке?Если у меня есть <input type='radio' checked="checked">, присутствие этого элемента в адресной строке может привести к тому, что ввод фактически не проверяется (как и ожидалось)

Как мне избежать этого поведения?


Пример кода:

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" style="min-height:100%;">
    <head>
        <title>stuff2test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body class="popup" >
        <form action="" id="frm">
            <a href="#;" onClick="alert('added');">add #; to addressbar, and refresh</a>

            <?php $rnd = mt_rand(1, 4); ?>

            <label for="r_v1"> <input id="r_v1" type="radio" value="v1" <?php if($rnd==1){ echo 'checked="checked"';}?> name="r"></input> checked?</label>
            <label for="r_v2"> <input id="r_v2" type="radio" value="v2" <?php if($rnd==2){ echo 'checked="checked"';}?> name="r"></input> checked?</label>
            <label for="r_v3"> <input id="r_v3" type="radio" value="v3" <?php if($rnd==3){ echo 'checked="checked"';}?> name="r"></input> checked?</label>

        </form>

        <button onClick="getElementById('frm').submit();" type="button">submit</button>

        <br/>
        RND: <?php echo $rnd;?>
        <?php
        if($rnd>0 && $rnd<=3){
            echo "Checkbox {$rnd} should be checked";
        }
        ?>
        <br/>

        <?php
            var_dump($_GET);
        ?>
    </body>
</html>

Edit2: немного почистил код, добавил эхо

Ответы [ 4 ]

6 голосов
/ 21 июля 2011

У вас есть такие ссылки, верно?

<a href="#">link</a>

И вы делаете с ними что-то, используя JavaScript (здесь: также jQuery), верно?

$('a').click(function() {
    alert(1);
});

Вам нужно добавитьreturn false в конце функции.

$('a').click(function() {
    alert(1);

    return false;
});

Редактировать:

После просмотра вашего кода ... Do NOT useвстроенный JavaScript!

Вам нужен элемент, который будет что-то делать при нажатии?Просто добавьте класс, ID - вы называете это ... чтобы вы могли различать элементы, а затем ...

$('a.my_class').click(function() { // $('a#my_id')
    // All you need to do.

    return false; // For preventing browser to add '#' after current link (if you have 'href="#"').
});
4 голосов
/ 25 июля 2011

После прочтения комментариев к вопросу ответ кажется ясным.

Проблема заключается в том, что Firefox пытается запомнить состояние формы при перезагрузке страницы, которая включает в себя, какие флажки отмечены, а какие нет.«т.Поэтому, даже если вы изменяете значения по умолчанию в HTML при перезагрузке, Firefox видит его как ту же форму и игнорирует значения по умолчанию, установленные в HTML, в пользу того, что он сохранил до перезагрузки.

У меня естьслышал, что вы можете отключить это поведение, указав HTTP-заголовок Cache-Control: no-store или указав autocomplete="off" в элементах формы.Но я не проверял ни одно решение лично.Или вы можете использовать Javascript для сброса формы при загрузке страницы (либо с помощью объекта формы reset(), либо путем явной установки значения каждого поля).

1 голос
/ 21 июля 2011

Хеш (#) - это специальный символ в URL. Все, что приходит после этого, не отправляется на сервер, поэтому, если вы используете хешированные URL-адреса, вам действительно нужно использовать POST (или запрос AJAX для нехешированного URL-адреса, если GET необходим) для отправки данных формы.

Альтернативой является реализация чего-то похожего на _escaped_fragment_ от Google, чтобы гарантировать, что содержимое вашего URL после хэша будет отправлено на сервер.

0 голосов
/ 31 июля 2011

Я широко использую этот "трюк", и у меня нет проблем, потому что я использую элемент управления input type = "submit".

Если вы замените строку:

<button onClick="getElementById('frm').submit();" type="button">submit</button>

с помощью

<input type="submit" value="submit" />

решить проблему, не меняя якоря и не касаясь кода JavaScript.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...