Я пытаюсь использовать «единый источник» для страницы формы, которая может находиться в режиме редактирования или просмотра. По разным причинам здесь не используются элементы управления ASP.Net FormView или DetailsView.
Поскольку нет способа отключить текстовое поле, не сделав его содержимое серым (ну, мы могли бы «съесть» все нажатия клавиш в него, но это тоже не очень элегантно), а отключение раскрывающегося списка или списка - это не то, что мы хотите, наша первая попытка состояла в том, чтобы продублировать все элементы управления вводом формы с меткой и использовать CSS, чтобы выбрать, какие из них видны в зависимости от режима формы. Это работает, но некрасиво редактировать, и код программной части должен каждый раз заполнять оба элемента управления.
Мы могли бы контролировать видимость в коде программной части, чтобы избежать заполнения обоих элементов управления, но нам все равно нужно добавить их оба в форму.
Поэтому у меня возникла идея использовать jQuery для замены элементов управления вводом на элементы <label>, <div> или <span>. В некоторой степени это работает путем создания соответствующих селекторов и использования метода jQuery replace() для динамической замены элементов.
Проблема в том, что мне нужно не только скопировать содержимое, но и стили, атрибуты и размеры исходных элементов управления вводом (на данный момент мы говорим только о текстовых полях - у нас есть другое решение для раскрывающихся списков и списков). .
Грубая сила должна работать - «сделайте резервную копию» всех атрибутов элемента управления вводом, создайте новый элемент «только для чтения», затем замените элемент управления вводом новым элементом. Я ищу что-нибудь попроще.
Вкратце, используя jQuery, как лучше всего заменить текстовое поле меткой, чтобы метка имела то же содержимое и отображалась в том же месте и стиле, что и текстовое поле?
Вот что у меня есть на данный момент:
$(":text").each( function() {
var oldClass = $(this).attr("class");
var oldId = $(this).attr("id");
var oldHeight = $(this).outerHeight();
var oldWidth = $(this).outerWidth();
var oldStyle = $(this).attr("style");
$(this).replaceWith("<div id='" + oldId + "'>" + $(this).val() + "</div>");
$("div#" + oldId).attr("class", oldClass);
$("div#" + oldId).attr("style", oldStyle);
$("div#" + oldId).width(oldWidth);
$("div#" + oldId).height(oldHeight);
$("div#" + oldId).css("display", "inline-block");
});





Когда я это сделал, мне пришлось «съедать» каждое нажатие клавиши, как вы описываете, и отображать его в «скрытом» теге span, который отражает элемент <input или <select. Все теги span имеют класс css, стилизованный с использованием селекторов мультимедиа для отображения только для печати, а входы имеют класс css, стилизованный для отображения только на экране.
Если вы не возражаете против статической ширины, которая не масштабируется до размера текста, вы также можете просто стилизовать свои теги <input, чтобы не отображать границу для печати, но это довольно некрасиво.
Почему бы не использовать плагин редактирования на месте, например Jeditable. Таким образом, вы можете создать свой режим просмотра и редактировать каждое поле одним нажатием кнопки.
Это может не соответствовать вашим потребностям, но это возможно.
Теги <input> и <textarea> поддерживают свойство только для чтения. Поведение полей только для чтения немного отличается от поведения отключенных. Вот что говорит HTML 4.01 Рекомендация:
When set, the readonly attribute has the following effects on an element:
Read-only elements receive focus but cannot be modified by the user.
Read-only elements are included in tabbing navigation.
Read-only elements may be successful. ("Successful" means it will be submitted as a parameter.)
Еще одно ключевое отличие состоит в том, что элементы с этим атрибутом можно стилизовать так, как вам нравится. (Например, вы можете удалить или изменить границы и фон.) Таким образом, вместо того, чтобы создавать новые элементы и копировать атрибуты, вы можете просто добавить или удалить атрибут только для чтения.
Затем вы можете создать стиль для этих полей "input[readonly] {}". Отметив, конечно, что популярные версии IE игнорируют селектор атрибутов в CSS. (Так что, возможно, просто определите класс, который вы добавляете и удаляете.)
Исправить опечатку; * только чтение (последний абзац). +1 за то, что у меня такая же идея, как и у меня. знак равно
Хорошо, большое "да" от меня. Я думаю, что это работает нормально (хотя мой код jQuery работает довольно хорошо).
ТАК снова на помощь! Этот ответ помог мне решить ту же проблему, спасибо!
Это действительно здорово, и я буду иметь это в виду, но это слишком сложно, чтобы справиться с элементами управления ASP.Net. Я обязательно с этим поэкспериментирую ...