在 HTML 中更改对象标记上的数据内容

IT技术 javascript html object
2021-03-09 11:00:56

我有一个 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); 
}

这似乎是一种相当糟糕的方式。有谁知道更改嵌入页面的“正确”方法?

谢谢!

编辑:为了回应下面的答案,这里是我现在使用的页面的完整来源。使用 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 页面只是简单的 HTML 页面,分别显示文本“Test1”和“Test2”。

6个回答

你可以用setAttribute做到这一点

document.getElementById("contentarea").setAttribute('data', 'newPage.html');

编辑:还建议您使用 window.onload 来确保 DOM 已加载,否则您将无法访问其中的对象。

它可能是这样的:

function changeData(newURL) {
    if(!document.getElementById("contentarea")) 
        return false;
    document.getElementById("contentarea").setAttribute('data', newURL);
}

window.onload = changeData;

您可以在此处阅读有关 window.onload 的更多信息

但是选择器有效吗?如果你 alert(document.getElementById("contentarea")) 它说什么?如果显示未定义,则未加载 DOM。您应该使用 document.onload。我会在我的答案中添加它,因为这里的字符还不够。
2021-04-30 11:00:56
setAttribute像魅力一样工作!!虽然我使用这种方法来显示 PDF 文档。
2021-04-30 11:00:56
setAttribute()也不适合我。该值在 dom 检查器中确实发生了变化,但<object>标记的呈现内容不会更新。
2021-05-12 11:00:56
由于某种原因,我目前无法使其正常工作。该对象仍显示旧页面。如果我没有任何尤里卡时刻,我将发布我稍后使用的完整 HTML 页面。
2021-05-15 11:00:56

这似乎是一个浏览器错误,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 );
对象内容不刷新的原因是从数据属性中删除值不会清除窗口中对象元素创建的文档。如果来源不同(即在窗口中打开文件),出于安全原因,您无权访问该窗口的内容。因此,删除整个标签是有意义的,并在需要时重新创建。这就是为什么这个解决方案完全有效的原因。谢谢。
2021-05-03 11:00:56

这就是我最终实现它的方式。你可以做

document.getElementById("contentarea").object.location.href = url;

或许

document.getElementById("contentarea").object.parentWindow.navigate(url);

Object 元素还有一个“readyState”属性,可用于检查包含的页面是“加载”还是“完成”。

这对我不起作用。这两个object.locationobject.parentWindow不确定。
2021-04-23 11:00:56

我找到了一个非常简单的解决方案,它也适用于 Chrome。诀窍是使对象(或父元素)不可见,更改数据属性,然后再次使对象可见。

在下面的代码中,假设 object_element 是对象元素,parent_element 是父元素,url 是数据的 url。

parent_element.style.display = 'none'; // workaround for Chrome
object_element.setAttribute('data', url);
parent_element.style.display = '';