كيف يمكنني إنشاء إطار iframe بنفس المجال مثل الصفحة في Safari/WebKit
-
21-08-2019 - |
سؤال
المشهد:أنا أكتب القطعة القابلة للتضمين.ويأخذ شكل أ <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.آسف لا أستطيع أن أكون أكثر فائدة من ذلك.