innerHTML 的动态等价物?

Posted

技术标签:

【中文标题】innerHTML 的动态等价物?【英文标题】:Dynamic equivalent of innerHTML? 【发布时间】:2011-01-05 06:12:09 【问题描述】:

我想获取可能已被用户更改的元素的 innerhtml

例如,我想知道单选按钮的状态:

<input type="radio" name="Q_209" value="A" checked>

<input type="radio" name="Q_209" value="A">

在现代浏览器中,innerHTML 只是在页面加载时给出原始标签(如discussed at length here):它不记录单选按钮是否已被用户选中。

是否有任何安全的方法来获取更新的 HTML?我知道有一些方法可以在 javascript 中获取单选按钮本身的状态,但我想要的是完整的、更新的 HTML。

谢谢!

【问题讨论】:

这是个好问题。据我所知,现有功能无法做到这一点,您可能必须为可能非常繁重的功能构建自己的功能 - 也许更聪明的人会证明并非如此。 没有答案,仅供参考:IE8 实际上确实显示了当前的 CHECKED 状态。你能解释一下为什么需要这个吗?可能还有另一种解决方案。 因此,根据您链接的帖子,更新表单输入时对 HTML 的影响似乎是未定义的。因此,您不能指望只查看 HTML。我们真正需要做的是以某种方式将当前感兴趣的 DOM 对象转换为 HTML。我想不出一个简单的方法。 如果您解释为什么需要这样做,我们可能会找到一个很好的解决方法,而无需编写您自己的 HTML 生成函数。 感谢您的所有回答。原因是我正在写一个测验;它一次显示一个问题,但我想记录用户为每个问题给出的答案,以便我可以显示他们最后一起给出的所有问题和答案。 换句话说,我想将每个问题的innerHTML与答案状态一起保存在某个地方,以便于重新显示。最好直接使用 HTML,而不是将答案存储在 Javascript 数组中的某个位置,然后必须编写另一个函数来再次显示单选按钮。但是,如果这就是它所需要的...... 【参考方案1】:

如前所述,HTML 不存储表单元素的当前 状态。 HTML 定义表单元素的初始或默认状态。 DOM 存储 volatile 表单状态。

例如,这个 HTML

<input type="radio" name="Q_209" value="A" checked>

会将元素的 defaultChecked 属性设置为 true,即使选中了组中的其他单选按钮,该属性也会持续存在。

更改 defaultChecked 属性确实会更新 outerHTML。

因此,如果您遍历所有表单元素,将当前值/已检查/已选择属性复制到 defaultValue/defaultChecked/defaultSelected 属性,则您可能能够获得您正在寻找的更新后的 outerHTML。

【讨论】:

【参考方案2】:

据我所知,HTML 元素属性的实际顺序可以由浏览器解释,因此没有可靠的方法来确定您是在处理&lt;input type="radio" name="Q_209" value="A" checked&gt; 还是&lt;input checked="true" name="Q_209" value="A" type="radio"&gt;

但是,您可以使用for ... in 语句获取元素的所有属性和值:

var foo = document.getElementById('form_id')['Q_209'];
var foo_properties = [];

for (var prop in foo) 
   // do something with prop and foo[prop];      

这意味着您可以将在元素中找到的属性与您实际关心的属性子集(特定于此特定标记或更大范围的“html”属性)进行比较,以获取元素的“html 状态”并且能够重建它,或者它的字符串表示。

var input_foo = document.getElementById('form_id')['Q_209'];
var awesome_properties = 'type':'','name':'','value':'','checked':'';
var tag = '<input ';
var properties = '';

for (var prop in foo) 
   if (prop in awesome_properties) 
      properties += ' '+prop+'="'+foo[prop]+'"';
   


tag += properties;
tag += '>';

window.alert(tag);

【讨论】:

“我知道有办法在 Javascript 中获取单选按钮本身的状态,但我想要的是完整的、更新的 HTML。” 将此作为公认的答案,因为这似乎是满足我需要的最佳方式。谢谢。【参考方案3】:

你想要 jQuery 中的 :checked 和

$('input[type=radio]:checked').html()

【讨论】:

【参考方案4】:

您可能必须自己遍历 DOM 树并生成 HTML

【讨论】:

【参考方案5】:

事实上,HTML 并没有真正“更新”。 DOM 树是,这就是您所看到的,但 HTML 本身保持不变(这就是 innerHTML 保持相同值的原因)

【讨论】:

知道有用,但不是解决 OP 问题的方法。不过,我不会 -1,因为了解差异很重要。 DOM 树也没有真正改变,只是与特定节点相关的状态。

以上是关于innerHTML 的动态等价物?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 IF 语句中读取 null 的属性“innerHTML”[重复]

JQuery 中的 innerHTML 等价物是啥? [复制]

XMl 文档的 html() 方法或 innerHTML 属性的等价物

无限滚动

innerHTML 剥离动态添加的字符

Javascript动态删除重复的innerHTML