ما يجب فعله عندما يقوم moveToElementText الخاص بـ IE بإصدار استثناء وسيطة غير صالحة

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

سؤال

لقد كتبنا مكونًا إضافيًا لمحرر النصوص Xinha للتعامل مع الحواشي السفلية.يمكنك إلقاء نظرة على:http://www.nicholasbs.com/xinha/examples/Newbie.html

من أجل معالجة بعض المشاكل المتعلقة بالطريقة التي يتعامل بها Webkit وIE مع الروابط في نهاية الأسطر (لا توجد طريقة لاستخدام المؤشر للخروج من الرابط الموجود على نفس السطر)، نقوم بإدراج عنصر فارغ ونقل التحديد إليه، من الانهيار الصحيح.يعمل هذا بشكل جيد في Webkit وGecko، ولكن لسبب ما، يقوم moveToElementText بإخراج استثناء وسيطة غير صالحة.بغض النظر عن العنصر الذي نمرره إليه، يبدو أن الوظيفة معطلة تمامًا.ومع ذلك، يبدو أن هذه الوظيفة تعمل في مسارات التعليمات البرمجية الأخرى.

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

  if (Xinha.is_ie)
  {
    var mysel = editor.getSelection();
    var myrange = doc.body.createTextRange();
    myrange.moveToElementText(newel);
  } else
  {
    editor.selectNodeContents(newel, false);
  }

الكود المعني موجود في svn على:https://svn.openplans.org/svn/xinha_dev/InsertNote

تم إنشاء هذا البرنامج المساعد مقابل فرع Xinha المتوفر من svn على:http://svn.xinha.webfactional.com/branches/new-dialogs

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

المحلول

إنه غير مرئي في المقتطف أعلاه، ولكن تمت إضافة newel إلى dom باستخدام عنصر آخر كان هو نفسه ملحقًا بـ DOM.عند إدراج عنصر dom، يجب عليك إعادة استرداد المقبض الخاص بك إذا كنت ترغب في الإشارة إلى أشقائه، نظرًا لأن المقبض غير صالح (لست متأكدًا، ولكن أعتقد أنه يشير إلى عنصر DOM داخل جزء من المستند وليس الموجود داخل المستند.) بعد إعادة استرداد المقبض من عملية الإدراج، توقف moveToElementText عن طرح استثناء.

نصائح أخرى

لقد مررت بتجربة مؤسفة في تصحيح أخطاء استثناء IE هذا عدة مرات مختلفة أثناء تنفيذ محرر WYSIWYG، وينشأ ذلك دائمًا من الوصول إلى خاصية على عقدة DOM (مثل .parentNode) أو تمرير عقدة DOM إلى وظيفة (مثل moveToElementText) بينما عقدة DOM ليست موجودة حاليًا في المستند الذي يتم عرضه.

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

المثير الحقيقي هو أنه في كثير من الأحيان لا يمكن حماية مظهر استثناء "الوسيطة غير الصالحة" الخاص بـ IE6 عن طريق المحاولة/الالتقاط.

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