سؤال

أقوم بتغيير IFRAME src من أجل إعادة تحميله، فإنه يعمل بشكل جيد ويطلق النار onload الحدث عند تحميل HTML الخاص به.

لكنه يضيف مدخلاً إلى التاريخ، وهو ما لا أريده.هل هناك أي طريقة لإعادة تحميل IFRAME مع عدم التأثير على السجل؟

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

المحلول

ويمكنك استخدام جافا سكريبت location.replace :

window.location.replace('...html');
<اقتباس فقرة>   

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

نصائح أخرى

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

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

وتحرير: JDandChips يذكر بحق أن تتمكن من إزالة من DOM، modifiy، وإعادة إلحاق. بناء جديدة غير مطلوب.

وكما قلت جريج أعلاه، وظيفة .replace () هي كيفية القيام بذلك. أنا لا يمكن أن يبدو لمعرفة كيفية الرد على جوابه *، ولكن الحيلة هو مرجع الملكية إطارات iFrames contentWindow.

var ifr = document.getElementById("iframeId");
ifr.contentWindow.location.replace("newLocation.html"); 

و* علم فقط أنا بحاجة الى مزيد من سمعة التعليق على إجابة.

وهناك طريقة بديلة لإعادة إطار iframe سيكون لإزالة الإطار من من DOM، تغيير src وثم إعادة إضافته.

في نواح كثيرة وهذا هو مماثل لاقتراح replace()، ولكن كان لي بعض القضايا عندما حاولت هذا النهج مع History.js وإدارة الدول يدويا.

var container = iframe.parent();

iframe.remove();
iframe.attr('src', 'about:blank');

container.append(iframe);

وحل واحد هو استخدام علامة object بدلا من العلامة iframe.

واستبدال هذا:

<iframe src="http://yourpage"/>

وقبل هذا:

<object type="text/html" data="http://yourpage"/>

وسوف يسمح لك لتحديث السمة data دون أن يؤثر ذلك التاريخ. وهذا مفيد إذا كنت تستخدم إطار التعريفي مثل React.js حيث ليس من المفترض لك أن تفعل أي أمر حتمي لتحديث DOM.

ومزيد من التفاصيل حول الاختلافات بين iframe وobject: <لأ href = "https://stackoverflow.com/questions/924946/use-of-iframe-or-object-tag-to-embed-web-pages-in -another / 32854398 # 32854398 "> استخدام iframe أو علامة كائن لتضمين صفحات الويب في آخر

وفي محاولة لاستخدام هذه الوظيفة لاستبدال الإطار من العمر مع الإطار من جديد التي يتم نسخها من العمر واحد:

function setIFrameSrc(idFrame, url) {
    var originalFrame = document.getElementById(idFrame);
    var newFrame = document.createElement("iframe");
    newFrame.id = originalFrame.getAttribute("id");
    newFrame.width = originalFrame.getAttribute("width");
    newFrame.height = originalFrame.getAttribute("height");
    newFrame.src = url;    
    var parent = originalFrame.parentNode;
    parent.replaceChild(newFrame, originalFrame);
}

استخدم مثل هذا:

setIFrameSrc("idframe", "test.html");

وبهذه الطريقة سوف لن تضيف URL من iframe للمتصفح التاريخ.

استخدم طريقة replace لتجاوز إضافة URL إطار iframe إلى تاريخ:

وHTML:

<iframe id="myIframe" width="100%" height="400" src="#"></iframe>

وجافا سكريبت:

var ifr = document.getElementById('mIframe')
if (ifr) {
  ifr.contentWindow.location.replace('http://www.blabla.com')
}

الحل الأكثر بساطة وسرعة التحميل
يستخدم window.location.replace لعدم تحديث السجل عند تحميل الصفحة أو الإطار.

بالنسبة للروابط فهي كالتالي:

<a href="#" onclick="YourTarget.location.replace ('http://www.YourPage.com');">
The targeted Link</a>

أو

<a href="javascript:YourTarget.location.replace ('http://www.YourPage.com');">
The targeted Link</a>



لكن إذا كنت لا تريد أن يعمل من الرابط ولكن أن يعمل تلقائيًا عند تحميل الإطار، فمن iframe يجب عليك وضع هذا في القسم الأساسي لملف iframe:

onload="window.location.replace ('http://www.YourPage.com');"


إذا لم يتم تحميل التحميل في iframe لسبب ما، فضع اسم الإطار المستهدف بدلاً من window في بناء الجملة مثل هذا:

onload="YourTarget.location.replace ('http://www.YourPage.com');"



ملحوظة: لهذا البرنامج النصي كل شيء onclick, onmouseover, onmouseout , onload و href="javascript:" سيعمل.

وJDandChips الجواب عملت بالنسبة لي على الإطار من عبر المنشأ (يوتيوب)، ومن هنا في الفانيليا JS (بدون مسج):

const container = iframe.parentElement;

container.removeChild(iframe);

iframe.setAttribute('src', 'about:blank');

container.appendChild(iframe);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top