display:none содержимое, скопированное в буфер обмена, видимое при вставке

У меня проблема с неотображаемыми элементами HTML, которые копируются в буфер обмена, а затем отображаются при вставке содержимого в MS Word, Outlook и т. д.

Например:

<p>Hello</p>
<p style="display: none;">I'm Hidden</p>
<p>World</p>

Если я просмотрю этот HTML-код в браузере, скопирую текст в буфер обмена, а затем вставлю в Outlook, средний абзац останется скрытым. Хорошие новости.

Однако в этом примере:

<p>Hello</p>
<input type="text" value="I'm not hidden" style="display: none;" />
<p>World</p>

Если я сделаю то же самое - скопирую в буфер обмена, вставлю в Outlook - текстовый ввод будет виден.

Есть ли способ подавить это? (Не прибегая к совету пользователям выбрать «Сохранить только текст» в Outlook.)

Спасибо!


person stubotnik    schedule 09.04.2009    source источник
comment
Вы должны знать тот факт, что, даже если текст выше не отображается после копирования в Outlook, он все равно остается там. Если ваши пользователи этого не знают, вы столкнетесь с некоторыми из этих вещей. В этом совершенно секретном PDF-файле предложения зачернены, но это просто черный текст на черном фоне, какая-то катастрофа.   -  person Boldewyn    schedule 29.06.2009
comment
В в Firefox 4.0 это исправлено.   -  person Koterpillar    schedule 27.05.2011


Ответы (5)


Похоже, вам нужно, чтобы JavaScript создавал разделы DOM, а не просто изменял стили CSS. Вместо того, чтобы изменять свойство отображения абзаца «Я скрыт», пусть JavaScript создаст этот элемент, когда вы хотите, чтобы он отображался, и удалите его, когда вы хотите его скрыть.

Если элементы достаточно сложны, то, возможно, вы можете разместить их внизу документа с помощью «display:none», но затем переместить их в то место, где вы хотите, чтобы они были видны.

person John Saunders    schedule 28.06.2009
comment
Я думаю ты прав. Кажется, что Outlook всегда будет отображать мой контент, скрытый с помощью CSS, так что это, вероятно, единственный разумный способ добиться того, что мне нужно. Спасибо! - person stubotnik; 30.06.2009

Используйте type='hidden' вместо type='text' для поля ввода и оберните его внутри div со стилем, установленным для отображения: none

person rahul    schedule 09.04.2009
comment
Привет-спасибо за быстрый ответ. К сожалению, эта проблема возникает и для других полей формы, где у меня нет скрытой опции (например: ‹выбрать›). Контейнер display:none также не исправляет это — ‹div style=display: none;›‹select style=display: none;› и т. д. — по-прежнему отображается при вставке. - person stubotnik; 09.04.2009
comment
Извините, что перебиваю. Но какая польза от этих элементов управления, если они не отображаются на странице. - person rahul; 09.04.2009
comment
Нет проблем — они отображаются/скрываются при необходимости с помощью JavaScript. - person stubotnik; 09.04.2009
comment
Все эти отображаемые/скрытые элементы управления находятся внутри одного div или они находятся в разных контейнерах на странице??? Можете ли вы использовать asp:Panel вместо div в качестве контейнера этих элементов?? - person rahul; 09.04.2009
comment
(1) Непосредственные родители этих элементов не являются одним и тем же контейнером (2) Не используется asp... - person stubotnik; 14.04.2009

Вы должны знать, что скрытие HTML с помощью CSS работает только в том случае, если средство визуализации поддерживает все стили CSS.

Тот факт, что вы не видите скопированный/вставленный HTML-код в Outlook, не означает, что данных еще нет.

Я не уверен, чего вы на самом деле пытаетесь достичь: зачем вам вообще нужно, чтобы ваши пользователи копировали HTML в Outlook?

person devio    schedule 18.06.2009
comment
Я не хочу, чтобы они копировали HTML в Outlook, но они настаивают! :-) (это для интранет-приложения.) - person stubotnik; 26.06.2009

Если вы требуете, чтобы пользователи копировали контент, я бы рекомендовал поместить этот контент в ‹текстовое поле /› и позволить им выбирать/копировать, нажимая кнопку. В браузерах может быть сложно выбрать правильный текст.

person Brandon Gano    schedule 28.06.2009
comment
сбросить содержимое в ____? :-) - person stubotnik; 30.06.2009

Вот решение, которое я использовал, чтобы обойти это.

Стратегия:

  1. генерировать уникальный номер при удалении элемента
  2. замените элемент в DOM новым div (также известным как div-заменитель) с идентификатором, который мы сможем найти, учитывая, что мы знаем уникальный номер, сгенерированный на последнем шаге.
  3. добавить свойство к элементу, чтобы, когда мы увидим его позже, мы могли извлечь уникальный номер
  4. переместите элемент в div, который объявлен в переменной, чтобы полностью удалить его из документа.
  5. Когда мы хотим переместить элемент обратно, мы просто получаем уникальный номер из свойства, находим замещающий div, который мы оставили, и заменяем его исходным элементом.

Вот несколько заметок:

  1. Я использовал slideUp() и slideDown() для анимации удаления, но вы можете заменить эти вызовы по своему усмотрению.
  2. Я помещаю элементы в элемент div в переменную. Вы можете переместить его в другое место в DOM, но я хотел, чтобы он был полностью удален. Вы также можете просто поместить его в переменную или массив. Причина, по которой я использовал переменную div, заключается в том, что я хотел иметь возможность использовать для нее поиск DOM jQuery, но я не хотел этого в DOM. Например, я могу сделать: whereHiddenThingsLive.find('.some-class').

Код:

var whereHiddenThingsLive = $('<div></div>');
var nextNum = 0;

function hideElement(element) {
    if (element.hasClass('sop-showing')) {
        element.finish();
    }
    if (element.is(':hidden') || element.hasClass('sop-hiding')) return;
    var num = nextNum++;
    element.addClass('sop-hiding');
    element.slideUp(400, function () {
        var replacer = $('<div class="hide-replacer" style="display:none;"></div>').prop('id', 'hide-replacer-' + num);
        element.prop('replaced-by', num);
        element.after(replacer);
        element.appendTo(whereHiddenThingsLive);
        element.removeClass('sop-hiding');
    });
}

function showElement(element) {
    if (element.hasClass('sop-hiding')) {
        element.finish();
    }
    if (element.is(':visible') || element.hasClass('sop-showing')) return;
    element.addClass('sop-showing');
    var num = element.prop('replaced-by');
    element.detach();
    element.removeProp('replaced-by');
    $('#hide-replacer-' + num).after(element).remove();
    element.slideDown(400, function() {
        element.removeClass('sop-showing');
    });
}
person tster    schedule 21.05.2014