埋め込みHTMLページをホストするためのObjectタグを含むHTMLページがあります。
<object style="border: none;" standby="loading" id="contentarea"
width="100%" height="53%" type="text/html" data="test1.html"></object>
ただし、オブジェクトタグ内のHTMLページを変更する必要があります。現在のコードは、オブジェクトのクローンを作成し、次のように既存のオブジェクトをそれに置き換えているようです:
function changeObjectUrl(newUrl)
{
var oContentArea = document.getElementById("contentarea");
var oClone = oContentArea.cloneNode(true);
oClone.data = newUrl;
var oPlaceHolder = document.getElementById("contentholder");
oPlaceHolder.removeChild(oContentArea);
oPlaceHolder.appendChild(oClone);
}
これは、これを行うにはかなり貧弱な方法のようです。誰かが埋め込まれたページを変更する「正しい」方法を知っていますか?
ありがとう!
[〜#〜] edit [〜#〜]:以下の回答に対する回答として、現在使用しているページの完全なソースを以下に示します。 setAttributeを使用しても、Objectタグのコンテンツは変更されないようです。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test</title>
<script language="JavaScript">
function doPage()
{
var objTag = document.getElementById("contentarea");
if (objTag != null)
{
objTag.setAttribute('data', 'Test2.html');
alert('Page should have been changed');
}
}
</script>
</head>
<body>
<form name="Form1" method="POST">
<p><input type="button" value="Click to change page" onclick="doPage();" /></p>
<object style="visibility: visible; border: none;" standby="loading data" id="contentarea" title="loading" width="100%" height="53%" type="text/html" data="test1.html"></object>
</form>
</body>
</html>
Test1.htmlページとTest2.htmlページは、テキスト「Test1」と「Test2」をそれぞれ表示する単純なHTMLページです。
これが私が最終的に達成した方法です。できるよ
document.getElementById("contentarea").object.location.href = url;
または多分
document.getElementById("contentarea").object.parentWindow.navigate(url);
Object要素には「readyState」プロパティもあり、これを使用して、含まれているページが「読み込み中」または「完了」しているかどうかを確認できます。
setAttribute でそれを行うことができます
document.getElementById("contentarea").setAttribute('data', 'newPage.html');
編集:DOMが読み込まれたことを確認するためにwindow.onloadを使用することもお勧めします。そうしないと、DOM内のオブジェクトにアクセスできなくなります。
これは次のようなものになる可能性があります。
function changeData(newURL) {
if(!document.getElementById("contentarea"))
return false;
document.getElementById("contentarea").setAttribute('data', newURL);
}
window.onload = changeData;
Window.onloadについての詳細を読むことができます ここ
これはブラウザのバグのようです。setAttribute()
は動作するはずです。私はこの回避策を見つけました、これはすべてのブラウザで機能するようです:
var newUrl = 'http://example.com';
var objectEl = document.getElementById('contentarea');
objectEl.outerHTML = objectEl.outerHTML.replace(/data="(.+?)"/, 'data="' + newUrl + '"');
上記のソリューションはFirefoxでは適切に機能しませんでした。何らかの理由でObjectタグが更新されません。私のオブジェクトタグはSVG画像を表示します。
これに対する私の解決策は、完全なオブジェクトノードをクローンに置き換えることでした。
var object = document.getElementById(objectID);
object.setAttribute('data', newData);
var clone = object.cloneNode(true);
var parent = object.parentNode;
parent.removeChild(object );
parent.appendChild(clone );
これはあなたの目的を達成するためのより良い方法だと思います。
HTML:
<div id="mytemplate"><div>
Js:
function changeTemplate(t){
var mytemplate = document.getElementById("mytemplate");
mytemplate.innerHTML = '<object type="text/html" data=' + t + '></object>';
}
changeTemplate('template.html');
changeTemplate('whatever.html');
var obj = document.getElementById("pdfDoc");
obj.setAttribute('data', newPdf);
Chromeバージョン54およびSafariで動作しましたが、IE 11では動作しませんでした
それらすべてで何が機能したか
var obj = document.getElementById("pdfDoc");
obj.setAttribute('data', newPdf);
var cl = obj.cloneNode(true);
var parent = obj.parentNode;
parent.removeChild(obj);
parent.appendChild(cl);
Chromeでも機能する非常にシンプルなソリューションを見つけました。トリックは、オブジェクト(または親要素)を非表示にし、データ属性を変更してから、オブジェクトを再び表示することです。
以下のコードでは、object_elementがオブジェクト要素で、parent_elementが親であり、urlがデータのURLであると想定しています。
parent_element.style.display = 'none'; // workaround for Chrome
object_element.setAttribute('data', url);
parent_element.style.display = '';
<div id='myob'>
<object style="border: none;" standby="loading" id="contentarea"
width="100%" height="53%" type="text/html" data="test1.html"></object>
</div>
$( '#myob')。html($( '#myob')。html());
User2802253に続いて、私はこれをSafariとFirefoxで使用していますが、これも強制的に再描画します。 (申し訳ありませんが、単純なコメントとして投稿するには評判が不十分です)。
theObject.style.visibility = null;
theObject.setAttribute("data", url);
theObject.style.visibility = "visible";
別の方法として、DIVにオブジェクトを埋め込むことができます
var newUrl = 'http://example.com';
var divEl = document.getElementById('divID');
var objEl = document.getElementById('objID');
objEl.data = newUrl;
// Refresh the content
divEl.innerHTML = divEl.innerHTML;
この問題の主な理由は、ローカルファイルで「/」を使用することです。
間違ったコード:
var obj = document.getElementById("hostedhtml");
obj.setAttribute('data', "pages\page2.html");
適切なコード:
var obj = document.getElementById("hostedhtml");
obj.setAttribute('data', "pages\\page2.html");
var content_area = document.getElementById("contentarea");
content_area.data = newUrl;
Chromeバージョン42.0.2311.90 mでオブジェクトを更新します
データ属性の変更は簡単です。ただし、すべてのブラウザで完全に機能するとは限りません。
コンテンツが常にHTMLである場合、iframeを使用しないのはなぜですか?
私の場合、このスニペットは仕事をしました
var object = document.getElementById(objectID);
object.setAttribute('data', newData);
var clone = object.cloneNode(true);
var parent = object.parentNode;
parent.removeChild(object );
parent.appendChild(clone );