كيف يمكنني إنشاء إطار iframe بنفس المجال مثل الصفحة في Safari/WebKit

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

سؤال

المشهد:أنا أكتب القطعة القابلة للتضمين.ويأخذ شكل أ <script> العلامة، التي تقوم بإنشاء إطار iframe يحتوي على كل ما يحتاج إلى عرضه.إطار iframe لا يوجد لديه src, ، ويكتب البرنامج النصي إليه باستخدام theIframe.contentWindow.document.write().يؤدي هذا إلى الاحتفاظ بعنصر واجهة المستخدم، ويمنع معرفات العناصر والبرامج النصية من التعارض مع الصفحة التي تم تضمين عنصر واجهة المستخدم فيها.

الخدعة:القطعة يجب أن تكون قادرة على تغيير حجمها.للقيام بذلك، يقوم بتعيين إطار iframe الذي يحتوي عليه style.height.يتطلب هذا الوصول إلى DOM الخاص بالصفحة الخارجية.في ثعلب النار و أي, هذا مسموح به، لأن مستند iframe والمستند الخارجي يعتبران من أصل مشترك.

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

السؤال:كيف يمكنني إنشاء إطار iframe برمجيًا والذي يعتبر مستند Safari/WebKit له نفس أصل مستند النافذة الذي أنشأه؟


يحرر:بعد المزيد من التجارب، لم أتمكن من إيجاد طريقة لإنشاء إطار iframe برمجيًا لا يوجد موقع له about:blank بغض النظر عما إذا قمت بتغيير محتوياته.

إذا قمت بإنشاء الإطار باستخدام document.createElement(), ، أعطها أ src والذي يشير إلى مورد HTML حقيقي من نفس الأصل يسمى "foo.html"، و document.body.appendChild() تعرض وحدة تحكم Safari العنصر كما هو متوقع في DOM، ولكن لا تظهر محتويات الصفحة، ويتم إدراج المستند في الشريط الجانبي باسم "about:blank".

إذا قمت بتضمين HTML لإطار iframe مباشرةً في الصفحة، فستكون محتويات foo.html يظهر، ويظهر "foo.html" في الشريط الجانبي.

إذا قمت بإدراج HTML باستخدام document.write(), ، أحصل على نفس النتيجة كما هو الحال مع document.body.appendChild().

يعمل كلا الإصدارين البرمجيين في Firefox.

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

المحلول 2

آها.يبدو أن هذا خطأ في WebKit.عندما يتم إنشاء إطار iframe برمجيًا، فإنه src يتم تجاهل السمة.بدلاً من ذلك، يتم تعيين الإطار افتراضيًا على about:blank ويجب توجيهه إلى عنوان URL للإشارة إلى مكان آخر.على سبيل المثال:

theIframe.contentWindow.location = theIframe.src

نصائح أخرى

أفضل اقتراح يمكنني تقديمه هو تعيين إطار iframe على صفحة فارغة على نفس الخادم (على سبيل المثال، plain.html) ثم تحرير المحتوى.أعلم أن هناك ألمًا في المؤخرة، لكنه حل بديل.

يمكنك أيضًا المحاولة

iframe.contentDocument.open("replace");
iframe.contentDocument.write("<b>This is some content</b>");
iframe.contentDocument.close();

ومع ذلك، لست متأكدًا مما إذا كان هذا يعمل فقط في IE.آسف لا أستطيع أن أكون أكثر فائدة من ذلك.

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