IE отправляет внутренний HTML при нажатии на элемент кнопки

Если вы уверены, что ввод-вывод является вашим узким местом, используйте потоки для чтения файлов, т. Е. С помощью ThreadPoolExecutor , и либо накапливайте их для массового запроса, либо сохраняйте по одному. У ES не будет никаких проблем, пока вы не используете ни уникальные, ни внутренние идентификаторы.

Bulk будет работать быстрее, просто сэкономив ваше время на издержках HTTP, а сохранение 1 на 1 немного проще для кодирования.

8
задан Kibbee 18 December 2008 в 18:35
поделиться

11 ответов

Я не знаю способа заставить его работать в IE7 (или IE6) без потребности в JavaScript (или странные многообразные конструкции).

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

Всегда существует решение JavaScript...

Следующее является большим количеством подтверждения концепции, этому будет нужна некоторая тонкая настройка, чем готовая острота jQuery, но это должно работать без потребности изменить любой HTML:

<!doctype html>
<html>

<head>

<title>Fix Buttons in IE6</title>

<script type="text/javascript">
function fixButtons() {
    var btns = document.getElementsByTagName('button');

    for (var i = 0; i < btns.length; i++) {
        btns[i].onclick = fixValue;
    }
}

function fixValue() {
    var btns = document.getElementsByTagName('button');

    for (var j = 0; j < btns.length; j++) {
        if (this == btns[j]) {
            this.value = this.getAttributeNode('value').value;
        }
        else {
            btns[j].parentNode.removeChild(btns[j--]);
        }
    }
}
</script>

</head>

<body onload="fixButtons()">

<form action="" method="get">
    <button type="submit" name="action1" value="value1">Do Action 1</button>
    <button type="submit" name="action2" value="value2">Do Action 2a</button>
    <button type="submit" name="action2" value="value3">Do Action 2b</button>
</form>

</body>

</html>

Если это только должно работать в IE7, а не в IE6, fiXValue() функция может быть уменьшена до просто:

this.value = this.getAttributeNode('value').value
0
ответ дан 5 December 2019 в 17:42
поделиться

Одно решение состоит в том, чтобы использовать JavaScript и скрытое поле

   <input type="hidden" name="actionparam" value="DoNothing">
   <input type="button" onclick="OnSubmitForm('ActionA')" Value="Click Here for A" />
   <input type="button" onclick="OnSubmitForm('ActionB')" Value="Click Here for B" />


   function OnSubmitForm(actionname) {
    var f = document.frm;
    f.actionparam.value = actionname;
    f.submit();
 }

Это работает скрытым CATPCHA также, и можно добавить некоторую клиентскую проверку в функции JavaScript

Править:

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

Дополнительные кнопки отключены в HTML, но затем повторно включены с JavaScript.
Протестированный код:

<html>
<head>
    <script type="text/javascript">
    <!--
    function OnSubmitForm(actionname) {
            var f = document.frm;
            f.actionparam.value = actionname;
            f.submit();
    }
    //-->
    </SCRIPT>
</head>
<body>
   <noscript>
        <div style="background-color: yellow; margin: 20px;" >
            You are using a limited version of the site because you don't have Javascript enabled
        </div>
    </noscript>


   <h1>form</h1>
    <form name="frm" method="post">
    <input type="hidden" name="actionparam" value="DefaultAction" />
    <button name="defaultbutton" type="submit">default action</button>
    <button name="extrabutton1" disabled onclick="OnSubmitForm('ExtraAction1')">Extra action 1</button>
    <button name="extrabutton2" disabled onclick="OnSubmitForm('ExtraAction2')">Extra action 2</button>
    </form>


   <h1>Results</h1>
   <h2>forms collection</h2>
   <ol>
   <%
   For x = 1 To Request.Form.count()
      Response.Write("<li>" + Request.Form.key(x) + "=" + Request.Form.item(x) + "</li>")
   Next
   %>
   </ol>


    <script type="text/javascript">
    <!--
    document.frm.extrabutton1.disabled = false;
    document.frm.extrabutton2.disabled = false;
    //-->
    </SCRIPT>

</body>
</html>
3
ответ дан 5 December 2019 в 17:42
поделиться

Я думаю, что необходимо использовать <input type="submit" /> вместо <button>.

0
ответ дан 5 December 2019 в 17:42
поделиться

Использовать <input> вместо <button>. Иначе вот описание хорошего основанного на jQuery взлома.

0
ответ дан 5 December 2019 в 17:42
поделиться

Я думаю, что необходимо пересмотреть это целое понятие. У меня есть чувство, что Ваш сценарий проходит примерно так:

  • Пользователь нажимает Save или Cancel
  • Серверная сторона, Вы проверяете на значение "Сохранения" или "Отмены"
  • Вы выполняете действия на основе этого

В действительности не должно иметь значения, каково значение кнопки Save. В PHP, например, можно просто проверить на значение в элементе Сохранения. Независимо от того, является ли значением "Сохранение" или "Sauver", можно выполнить функциональность сохранения.

Я приношу извинения, если я - путь от основы здесь. Сообщите мне, точны ли мои предположения.

1
ответ дан 5 December 2019 в 17:42
поделиться

Ссылка, которую Вы предоставили в вопросе, объясняет, что IE6 отправляет все кнопки с каждым представлением формы, таким образом, Ваше приложение не будет работать с IE6, какое обходное решение Вы используете. Я протестировал это и проверил, что IE6 действительно делает это. Это означает, что без JavaScript <кнопка> тег бесполезно с IE6, и, учитывая другое ограничение это сильно ограничено с IE7 также. Единственное обходное решение не-JavaScript, о котором я могу думать, должно поместить Ваш <кнопка> теги вне Вашего основного <форма> в их собственных формах. Вы могли сделать это с <a> теги также, но я не могу рекомендовать, чтобы, так как ссылки были, всегда ПОЛУЧАЮТ запросы и ДОБИРАЮТСЯ, запросы никогда не должны иметь побочных эффектов, таких как изменение данных.

<div style="float:left">
  <form name="shoppingCart" action="#c" method="GET">
    <input type="hidden" name="item1" value="hat">
    <input type="text" name="item1quantity" value="1"> Hat, red<br>
    <input type="hidden" name="item2" value="scarf">
    <input type="text" name="item2quantity" value="1"> Scarf, red<br>
    <button type="submit" name="button" value="purchase">Buy now!</button>
  </form>  
</div>
<div style="float:right">
  <form name="remove" action="#a" method="GET">
    <input type="hidden" name="item" value="item1">
    <button type="submit" name="button" value="delete1">Remove this item</button>
  </form>
  <form name="remove" action="#b" method="GET">
    <input type="hidden" name="item" value="item2">
    <button type="submit" name="button" value="delete2">Remove this item</button>
  </form>
</div>

Оборотная сторона использования нескольких форм - то, что Вы ограничены в том, что можно передать; если пользователь изменяет количество в вышеупомянутой форме, что информация не будет отправлена, когда пользовательские щелчки 'удалят'. Но Вы могли полагать, что корректная неисправность для пользователей non-JS, и использует JS для синхронизации данных в основной форме со скрытыми формами.

1
ответ дан 5 December 2019 в 17:42
поделиться

Как Eduardo упоминает, JavaScript походит на Ваш наилучший вариант. Однако необходимо будет так или иначе рассмотреть то, что, если пользователю отключили JavaScript, Вы не получите соответствующее значение.

1
ответ дан 5 December 2019 в 17:42
поделиться

Хорошие новости: Microsoft зафиксировала это в IE8 (только режим стандартов)

Плохие новости: Это все еще в бета-версии

Этот jQuery фиксирует работы хорошо, или можно взломать собственный JS для обработки IE.

Что касается тех, которые предлагают вход по кнопке, это прекрасно, но если Вы хотите графику или различные стили на Вашей кнопке, затем кнопка является единственным способом пойти.

1
ответ дан 5 December 2019 в 17:42
поделиться

Обычное обходное решение для получения это работающий с входом - отправляет, к munge значение в несколько атрибутов 'имени', например:

<input type="submit" name="submit.buttonA" value="Sausage" />
<input type="submit" name="submit.buttonB" value="Mash" />

Слой формы, который я лично использую, автоматически преобразует это, как будто 'отправлять' управление со значением 'buttonA' или 'buttonB' было нажато, но должно быть легко сделать вручную в большинстве сред.

2
ответ дан 5 December 2019 в 17:42
поделиться

Просто пришлось иметь дело с замечательной реализацией IE6 элементов button . Это решение действительно полагается на Javascript, но некоторые могут счесть его полезным.

Это особенно раздражает при использовании AbstractWizardController в среде Spring, поскольку элемент button является идеальным решением для " Кнопки мастера «Далее», «Назад» и «Готово» не работают в IE6.

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

$(function(){
if((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined)) {
    $('button').click( function(event) {
        var rx = /\bvalue ?= ?(".*?"|'.*?')/i;
        var matches = $(this)[0].outerHTML.match( rx );
        if( matches != null )
            $(this).attr( 'value', matches[1].substring( 1, matches[1].length - 1 ) );
        $('button').not( $(this) ).attr('disabled','disabled');
    });
}
}); 

Это добавит событие onclick ко всем элементам кнопки. Когда кнопка нажата, она захватывает внешний HTML-код кнопки, например:

<button name="playerId" value="34">Walter Payton</button>

и проанализируйте значение атрибута. Кажется, много проблем нужно сделать, чтобы получить значение, но я обнаружил, что getAttributeNode ('value'). Value вернул innerHTML, а не указанный атрибут значения, поэтому не очень помог. Затем мы устанавливаем подсовпадение регулярного выражения как значение кнопки. Он должен совпадать с ним, если вы используете двойные или одинарные кавычки в качестве разделителей, но вы действительно должны использовать какую-либо форму разделителя .

В результате вместо публикации «Walter Payton» он будет вместо этого разместите "34". Обратной стороной является то, что внешний вид кнопки на странице также изменится на «34» непосредственно перед отправкой формы.

Наконец, сценарий найдет все элементы кнопки, кроме нажатой, и установит их атрибут disabled в отключенное состояние. Это гарантирует, что они не будут включены в POST, и вы не получите ложных срабатываний.

2
ответ дан 5 December 2019 в 17:42
поделиться

Ознакомьтесь с этим проектом ie-button-fix , который использует поведение IE (то есть javascript) для аккуратного решения проблемы.

0
ответ дан 5 December 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: