Я веб-разработчик и нуждаюсь в помощи, чтобы обеспечить прогрессивное совершенствование.
Справочная информация. Я имею дело с веб-приложением, в котором многие пользователи берутся из прямого прокси-сервера, который удаляет JS.
Более того, некоторые пользователи также используют браузеры, которые не поддерживают HTML5, или браузеры, которые не могут запускать JS условно (например, Opera Mini).
В целом, HTML5 имеет больше возможностей, чем JS для этой пользовательской базы.
Текущий сценарий: В настоящее время это приложение не использует JS или HTML5 вообще. Представления форм приводят к полному обновлению страницы. Типичная форма выглядит так:
<form action="{% url 'submit_comment' %}" method="POST">
{% csrf_token %}
{{ my_form.comment }}
<button type="submit">OK</button>
</form>
Игнорировать {{ }}
номенклатуру. Этот синтаксис Django и просто используется для визуализации - в этом случае - текстового поля, в котором пользователь может написать комментарий.
Вопрос: для клиентов, которые могут поддерживать JS или HTML5, как я постепенно улучшаю опыт подачи формы?
Например, есть раздел этого приложения, в котором пользователи оставляют комментарии для чтения другими. В настоящее время они нажимают кнопку "ответить" и перенаправляются на новую страницу. Код для такой кнопки просто:
<form action="{% url 'response_page' %}" method="POST">
{% csrf_token %}
<input type="hidden" name="comment_id" value="{{ comment_id }}">
<button type="submit">reply</button>
</form>
Теперь мне нужно следующее:
1) Если клиент поддерживает JS/HTML5, DOM изменяется, и текстовое поле, привязанное к form
появляется прямо под кнопкой. Не происходит обновления.
2) Если клиент не поддерживает JS/HTML5, пользователь перенаправляется на новую страницу, как раньше.
Как можно запрограммировать это так, чтобы ничто не ломалось для неподдерживаемых пользователей, и насколько это возможно, насколько это возможно? Там много кнопок "ответа", сложенных друг на друга на странице, поэтому производительность также важна.
Я надеюсь, что будут установлены шаблоны для обработки такого рода вещей. Будучи веб-разработчиком, я не привязан к этим. Было бы здорово получить иллюстративный ответ.
Примечание. Я бы предпочел сделать это в HTML5, но также открыт для JS-решений, и я предпочитаю простой ванильный JS вместо того, чтобы что-нибудь прихоть.
Это очень простой ответ, который препятствует отправке формы, если javascript доступен, и добавляет требуемый ввод, как было предложено выше.
window.onload = function(){
var input = document.createElement("input");
input.type ='text';
input.name = "comment";
input.style.display = 'block';
document.getElementById('myForm').appendChild(input);
document.getElementById("submit").addEventListener("click", function(event){
event.preventDefault();
});
}
<form action="http://example.com" method="POST" aria-live="polite" id="myForm">
<input type="hidden" name="comment_id" value="">
<button id="submit" type="submit">reply</button>
</form>
display:none
установлен, это означает, что элемент никогда не попадает в дерево визуализации? Просто глядя на это с точки зрения производительности.
display: none
никогда display: none
находится в дереве рендеринга. Это также не доступно людям, использующим программы чтения с экрана, что, кажется, является желаемым результатом. Однако на этой ноте, вероятно, было бы целесообразно объявить об изменении DOM, подключив aria-live
для пользователей вспомогательных технологий. Если вы пойдете по этому пути, я бы также рекомендовал сохранить скрытый узел DOM в JS и добавлять его только после завершения отправки на основе AJAX. Вы бы хотели установить aria-live
на родительский контейнер внедренного div
.