لماذا لا يقوم IE7 بنسخ الكتل إلى الحافظة بشكل صحيح؟

StackOverflow https://stackoverflow.com/questions/136443

  •  02-07-2019
  •  | 
  •  

سؤال

لقد لاحظنا أن IE7 لديه سلوك غريب مع كتل التعليمات البرمجية المنشورة على Stack Overflow.على سبيل المثال، كتلة التعليمات البرمجية الصغيرة هذه:

public PageSizer(string href, int index)
{
    HRef = href;
    PageIndex = index;
}

النسخ واللصق من IE7، ينتهي بهذا الشكل:

public PageSizer(string href, int index){    HRef = href;    PageIndex = index;    }

ليس بالضبط ما كان يدور في أذهاننا..يبدو مصدر HTML الأساسي جيدًا بالفعل؛إذا قمت بعرض المصدر، سترى هذا:

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

إذن ما الخطأ الذي نفعله؟لماذا لا يستطيع IE7 نسخ ولصق HTML بطريقة عقلانية؟

تحديث: هذا له علاقة على وجه التحديد <pre> <code> الكتل التي يتم تعديلها في وقت التشغيل عبر JavaScript. يتم عرض ونسخ HTML الأصلي بشكل صحيح؛إنها نسخة JavaScript المعدلة من HTML والتي لا تعمل كما هو متوقع.لاحظ أن النسخ واللصق في WordPad أو Word يعمل لأن IE يضع محتوى مختلفًا في حافظة النص المنسق مقارنةً بحافظة النص العادي التي يحصل برنامج Notepad منها على بياناته.

هل كانت مفيدة؟

المحلول

يبدو أن هذا خطأ معروف في IE6 وأن prettify.js لديه حل بديل له.وعلى وجه التحديد، فإنه يستبدل علامات BR بـ ' '.

من خلال تعديل عملية التحقق للسماح بـ IE6 أو 7، سيعمل القص واللصق بشكل صحيح من IE7، ولكنه سيتم عرضه باستخدام خط جديد متبوعة ب فضاء.من خلال التحقق من وجود IE7 وتوفير ' ' فقط بدلاً من ' '، فإنه سيستمر في القص واللصق والعرض بشكل صحيح.

أضف هذا الكود إلى 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، لذا أعتقد أنه يتم عرضه بدون المساحة الناتجة عن ' ' التي تظهر في IE7، وإلا فإن الإصلاح يكون أبسط.

نصائح أخرى

ها هي القضية:

يستبدل البرنامج النصي لتلوين التعليمات البرمجية فواصل الأسطر بعلامات <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 />.

تحديث:مزيد من المعلومات في ردي الثاني:
لماذا لا يقوم IE7 بنسخ الكتل إلى الحافظة بشكل صحيح؟

هذا يبدو وكأنه خطأ في IE، ر العلامات داخل قبل أو شفرة لا يتم تحويلها إلى أسطر جديدة في المخزن المؤقت لنسخ النص العادي.المخزن المؤقت لنسخ النص المنسق جيد، لذلك يعمل اللصق كما هو متوقع لتطبيقات مثل com.wordpad.

تتم إزالة البرنامج النصي الجميل الذي يقوم بتلوين الكود الجميع المسافة البيضاء واستبدالها بعلامات HTML للمسافات والأسطر الجديدة.يبدو الكود الذي تم إنشاؤه كالتالي:

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

ال قبل و شفرة يتم عرض العلامات بشكل افتراضي باستخدام نمط CSS {مسافة بيضاء:قبل}.في هذه الحالة، يفشل IE في تحويل ملف ر العلامات في الأسطر الجديدة.سيعمل على HTML الأصلي الخاص بك لأن IE سينجح في تحويل الأسطر الجديدة الفعلية إلى أسطر جديدة.

من أجل إصلاحه لديك 3 خيارات.(أفترض أنك تريد HTML لطيفًا و القدرة على العمل بشكل جيد مع وبدون تمكين جافا سكريبت على العميل):

  1. يمكنك وضع الكود داخل div عادي واستخدام CSS لعرضه باستخدام {مسافة بيضاء:قبل}.يعد هذا حلاً بسيطًا، على الرغم من أنه قد لا يرضي متخصصي ترميز HTML.

  2. يمكن أن يكون لديك نسختان من الكود، إحداهما تستخدم الصحيح قبل / شفرة العلامات وأخرى في شعبة عادية.في CSS الخاص بك، تقوم بإخفاء div العادي.باستخدام جافا سكريبت يمكنك تجميل div العادي وإخفاء إصدار الكود/السابق.

  3. قم بتعديل البرنامج النصي الجميل للتعرف على أنه يعمل على ملف قبل أو شفرة العنصر وعدم استبدال المسافة البيضاء في هذا الحدث.


ملحوظات:

  • المهم ليس HTML الموجود في المصدر، ولكن HTML الذي يتم إنشاؤه بعد تشغيل البرنامج النصي الجميل عليه.

  • لا يزال هذا الخطأ موجودًا حتى لو كان وضع المساحة البيضاء لـ قبل تم تغييره إلى طبيعي باستخدام CSS.

لقد تناول هذا الموقع هذه المشكلة: http://www.developerfusion.com/tools/convert/csharp-to-vb/

أقترح زر "نسخ إلى الحافظة" كجزء من مربع عرض التعليمات البرمجية.سيقوم هذا الزر بنسخ نسخة المعلومات المعروضة كنص عادي.يمكن تخزين النص العادي كخاصية صفحة داخلية.

اخبار سيئة :لا يعمل أي من الإصلاحات المقترحة.تعديل prettify.js حول السطر 1000

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

يؤدي هذا إلى تباعد مزدوج في المتصفحات الأخرى، و ما زال لا يحل مشكلة نسخة IE7 إلى المفكرة!لذلك، حتى لو اكتشفت IE7 بشكل انتقائي، فإن هذا "الإصلاح" لا يصلح أي شيء.

أعتقد أنه ربما يكون مجرد خطأ في IE7 يتعلق بإعادة بناء JavaScript <pre> العنصر -- بغض النظر عن عدد الأسطر الجديدة التي أضعها هناك، لن يتغير أي شيء مع سلوك اللصق في المفكرة.

jeff atwood إنها الفكرة الصحيحة ، لكن التنفيذ لا يزال يحتاج إلى عمل.أعتقد أن رمز الهواء الخاص بي لم يقطعه :)

أظن أن الإصلاح الذي ذكرته سابقًا لا يعمل لأن prettify يقوم ببعض المعالجة الإضافية على النص بعد استدعاء السطر ~ 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 سيتطلب ، بدلاً من فقط.معرفة بالضبط ما الذي سيعمل مع المتصفحات التي ستخضع لإعداد اختبار أكثر شمولاً مما هو متاح لي في الوقت الحالي.

على أي حال، يبدو أن إدخال لـ IE7 هو ما يجب أن يحدث بشكل أساسي.سأستمر في البحث بشكل جميل لمعرفة ما إذا كان بإمكاني تضييق نطاق الأمر أكثر.

تحديث: يبدو أن IE7 يقوم بإزالة أحرف السطر الجديد ( أو ) من السلاسل التي تم تعيينها لخاصية HTML الداخلية.يبدو أنه يلزم إضافتهم مرة أخرى، حول السطر 1227.

ربما يعني الحل الصحيح إدراج علامة نائب حول السطر 1000، ثم استبدالها حول السطر 1227.

إزالة الداخلية <code>.يمكن أن يرى سلوك النسخ/اللصق في IE ذلك كعلامة مضمّنة وينسى المسافة البيضاء المرئية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top