Почему не делает копии IE7 <пред> <код> блоки к буферу обмена правильно?

Когда вы вводите x = 0, который создает новую переменную int (имя) и присваивает ей нуль.

Когда вы вводите x[age1], который пытается получить доступ к age1 й записи, как будто x были массивом.

37
задан Jeff Atwood 1 October 2008 в 01:31
поделиться

6 ответов

Кажется, что это - известная ошибка для IE6, и prettify.js имеет обходное решение для него. Конкретно это заменяет теги br '\r\n'.

Путем изменения проверки для обеспечения IE6 или 7 затем вырезание и вклейка будет работать правильно от IE7, но это представит с новая строка сопровождаемый пространство . Путем проверки на IE7 и обеспечения просто '\r' вместо '\r\n' это продолжит вырезать и вставлять и представлять правильно.

Добавляют этот код к prettify.js:

function _pr_isIE7() {
  var isIE7 = navigator && navigator.userAgent &&
       /\bMSIE 7\./.test(navigator.userAgent);
  _pr_isIE7 = function () { return isIE7; };
  return isIE7;
}

и затем изменяют функцию prettyPrint следующим образом:

   function prettyPrint(opt_whenDone) {
     var isIE6 = _pr_isIE6();
+    var isIE7 = _pr_isIE7();

...

-        if (isIE6 && cs.tagName === 'PRE') {
+        if ((isIE6 || isIE7) && cs.tagName === 'PRE') {
          var lineBreaks = cs.getElementsByTagName('br');
+         var newline;
+         if (isIE6) {
+           newline = '\r\n';
+         } else {
+           newline = '\r';
+         }
          for (var j = lineBreaks.length; --j >= 0;) {
            var lineBreak = lineBreaks[j];
            lineBreak.parentNode.replaceChild(
-               document.createTextNode('\r\n'), lineBreak);
+               document.createTextNode(newline), lineBreak);
          }

Вы видите работать пример здесь .

Примечание: я не протестировал исходное обходное решение в IE6, таким образом, я предполагаю, что это представляет без пространства, вызванного '\n', который замечен в IE7, иначе фиксация более проста.

35
ответ дан 27 November 2019 в 04:53
поделиться

Вот проблема:

Ваш сценарий колоризации кода заменяет разрывы строки < br/> теги. При копировании/вставке IE7, по-видимому, не переводит < br/> тег в разрыв строки как он делает для экрана.

, Другими словами, Ваш код становится этим:

public PageSizer(string href, int index)<br />{<br />    HRef = href;<br />    PageIndex = index;<br />    }

, Но Вы хотите, чтобы это стало этим:


public PageSizer(string href, int index)<br />
{<br />
    HRef = href;<br />
    PageIndex = index;<br />
}<br />

В последней версии prettify.js на Google Code, ответственная строка является строкой 1001 (часть recombineTagsAndDecorations):


html.push(htmlChunk.replace(newlineRe, '<br />'));

Отредактированный, на основе комментариев:
Для IE7, это - то, на что должна, вероятно, быть изменена строка:


html.push(htmlChunk.replace(newlineRe, '\n'));

(Принимающий newlineRe заполнитель).

Эта фиксация также держит в Chrome и FFX3... Я не уверен, который (если таковые имеются) браузерам нужен < br/> теги.

Обновление: [еще 1116] информация в моем втором ответе:
, Почему doesn' t IE7 копируют < pre> < code> блоки к буферу обмена правильно?

13
ответ дан 27 November 2019 в 04:53
поделиться

плохие новости: ни одна из предложенной работы мер. При изменении prettify.js вокруг строки 1000

html.push(htmlChunk.replace(newlineRe, '\n'));

Это вызывает двойной интервал в других браузерах, и все еще не решает копию IE7 к проблеме блокнота! Таким образом, даже если я выборочно обнаружил IE7, эта "фиксация" ничего не фиксирует.

я предполагаю, возможно, что это - просто ошибка в IE7, имеющем отношение к JavaScript, восстанавливающему <pre> элемент - неважно, сколько \n новых строк я поместил там, ничто не изменяет w/r/t на вставку к поведению блокнота.

0
ответ дан 27 November 2019 в 04:53
поделиться

Это похоже на ошибку в IE, теги BR в ПРЕД или , КОД не преобразовывается в новые строки в буфере копии простого текста. Буфер копии обогащенного текста прекрасен, таким образом, вставка работает как ожидалось на приложения как wordpad.

украшать сценарий, который окрашивает код, удаляет весь пробел и заменяет его HTML-тэгами для пробелов и новых строк. Сгенерированный код выглядит примерно так:

<pre><code>code<br/>&nbsp;&nbsp;code<br/>&nbsp;&nbsp;code<br/>code</code></pre>

ПРЕД и КОД теги представляются значениями по умолчанию со стилем CSS [1 133] {пробел: пред} . В этом случае IE не удается повернуться теги BR в новые строки. Это работало бы над Вашим исходным HTML, потому что IE успешно превратит фактические новые строки в новые строки.

для фиксации его, у Вас есть 3 опции. (Я предполагаю, что Вы хотите хороший HTML и , который способность работать хорошо с и без JavaScript включила на клиенте):

  1. Вы могли поместить код в нормальном отделении и использовать CSS для рендеринга его с помощью [1 135] {пробел: пред} . Это - простое решение, хотя не мог бы понравиться пуристу разметки HTML.

  2. у Вас могло быть две копии кода, одна использующая надлежащая ПРЕД [1 110] / КОД теги и другой в нормальном отделении В Вашем CSS, Вы скрываете нормальное отделение. Используя JavaScript Вы украшаете нормальное отделение и скрываетесь пред/версия кода.

  3. Изменяют украшать сценарий, чтобы распознать, что он действует на ПРЕД [1 112] или КОД элемент и не заменять пробел в таком случае.

<час>

Примечания:

  • то, Что важно, не является HTML в Вашем источнике, но HTML, который сгенерирован после того, как украшать сценарий имеет, работал на нем.

  • Эта ошибка все еще присутствует, даже если пробельный режим ПРЕД [1 114] изменяется на [1 115] нормальный использование CSS.

2
ответ дан 27 November 2019 в 04:53
поделиться

Удалите внутреннее <code>. IE скопировать/вставить поведение видело, что как встроенный тег и забывают о видимом пробеле.

-1
ответ дан 27 November 2019 в 04:53
поделиться

Atwood @Jeff Это - верная мысль, но реализация все еще должна работать. Я предполагаю, что мой воздушный кодекс просто не сократил его :)

я подозреваю, что фиксация, которую я упомянул ранее, не работает, потому что украшают, делает некоторую дополнительную обработку на тексте после того, как строку ~1000 называют.

Попытка отследить содержание назад от того, когда это добавляется к странице, я столкнулся с этим комментарием вокруг строки 1227:


// Replace <br>s with line-feeds so that copying and pasting works
// on IE 6.
// Doing this on other browsers breaks lots of stuff since \r\n is
// treated as two newlines on Firefox, and doing this also slows
// down rendering.

, Когда я снял isIE6 условие кода, оно главным образом работало в IE7 (был дополнительный разрыв строки наверху и нижняя часть), и Firefox 3... Но я предположил бы, что это вызывает проблемы с более старыми версиями FFX.

По крайней мере, кажется, что IE7 потребует \r\n, вместо просто \n. Выяснение точно, что будет работать, с которым браузеры возьмут более обширную тестовую установку, чем, я имею удобный в данный момент.

Так или иначе, вставляя \r\n для IE7, кажется, в основном что потребности произойти. Я буду иметь в наличии ввод по абсолютному адресу, украшают, чтобы видеть, могу ли я сузить его далее.

ОБНОВЛЕНИЕ: IE7, кажется, разделяет символы новой строки (\r или \n) от строк, которые присвоены innerHTML свойству. Похоже, что они должны быть включены назад вокруг строки 1227.

правильное решение А, вероятно, означало бы вставлять тег заполнителя вокруг строки 1000 и затем заменять ее вокруг строки 1227.

0
ответ дан 27 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

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