هل يجب على DOM تقسيم النص وتطبيع التأليف لإعطاء الهوية؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لقد انخرطت في مناقشة حول مراوغات تنفيذ DOM بالأمس، مما أدى إلى ظهور سؤال مثير للاهتمام بخصوص سلوكيات Text.splitText وElement.normalise، وكيف ينبغي أن يتصرفوا.

في DOM المستوى 1 الأساسية, ، يتم تعريف Text.splitText على أنه...

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

التطبيع هو...

يضع جميع العقد النصية في العمق الكامل للشجرة الفرعية الموجودة أسفل هذا العنصر في نموذج "عادي" حيث تفصل العلامات فقط (مثل العلامات والتعليقات وتعليمات المعالجة وأقسام CDATA ومراجع الكيانات) العقد النصية، أي أن هناك لا توجد عقد نصية مجاورة.يمكن استخدام هذا للتأكد من أن عرض DOM للمستند هو نفسه كما لو تم حفظه وإعادة تحميله، ويكون مفيدًا عند استخدام العمليات (مثل عمليات بحث XPointer) التي تعتمد على بنية شجرة مستند معينة.

لذلك، إذا أخذت عقدة نصية تحتوي على "Hello World"، المشار إليها في textNode، وقمت بذلك

textNode.splitText(3)

يحتوي textNode الآن على المحتوى "Hello"، وشقيق جديد يحتوي على "World"

إذا أنا بعد ذلك

textNode.parent.normalize()

ما هو textNode؟لا توضح المواصفات أن textNode يجب أن يظل تابعًا للأصل السابق، فقط تم تحديثه ليحتوي على جميع العقد النصية المجاورة (والتي تتم إزالتها بعد ذلك).يبدو أن إزالة جميع العقد النصية المجاورة، ثم إعادة إنشاء عقدة جديدة مع تسلسل القيم، هو سلوك متوافق، مما يترك textNode يشير إلى شيء لم يعد جزءًا من الشجرة.أو يمكننا تحديث textNode بنفس الطريقة كما في SplitText، بحيث يحتفظ بموضع الشجرة الخاص به، ويحصل على قيمة جديدة.

إن اختيار السلوك مختلف تمامًا حقًا، ولا يمكنني العثور على توضيح بشأن أيهما صحيح، أو إذا كان هذا مجرد خطأ في المواصفات (لا يبدو أنه تم توضيحه في المستويين 2 أو 3).هل يمكن لأي من معلمي DOM/XML إلقاء بعض الضوء؟

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

المحلول

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

عندما تكون في شك، برنامج دفاعي.

نصائح أخرى

على الرغم من أنه قد يبدو افتراضًا معقولًا، إلا أنني أوافق على أنه لم يتم توضيحه بشكل واضح في المواصفات.كل ما يمكنني إضافته هو أن الطريقة التي قرأتها بها، واحدة منهما textNode أو أنه شقيق جديد (أي.قيمة الإرجاع من splitText) سيحتوي على القيمة المرتبطة الجديدة - يحدد البيان أن جميع العقد في الشجرة الفرعية يتم وضعها في شكل طبيعي، وليس أن الشجرة الفرعية قد تم تطبيعها إلى بنية جديدة.أعتقد أن الشيء الآمن الوحيد هو الاحتفاظ بالإشارة إلى الوالد قبل التطبيع.

أعتقد أن كل الرهانات متوقفة هنا؛أنا بالتأكيد لن أعتمد على أي سلوك معين.الشيء الآمن الوحيد الذي يمكنك فعله هو الحصول على العقدة من أصلها مرة أخرى.

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