【问题标题】:Is there a way to transform a string from JSON into a DOM structure?有没有办法将字符串从 JSON 转换为 DOM 结构?
【发布时间】:2011-01-10 09:13:27
【问题描述】:

问题是:

我得到以下结构(用 PHP 生成)通过 JSON 作为字符串发送。

<article>

<header>  
    <h2><a href="#">url</a></h2>
    <p><time datetime="2009-11-05">05 Nov 2009</time></p>
</header>

<div class="entry"> 
    <p>something</p>
    ... 
</div>

<footer>something</footer>

</article>

我有一个网站上的文章列表,我需要用收到的文章替换现有文章。使用 jQuery,我会做这样的事情:

var $victim = $slider.find('article.loading:first'); 
    $fresh = $(basket.shift());

basket.shift()是收到的上述字符串形式的文章,$victim是现有的。


现在,我通常会这样做

$victim.replaceWith($fresh);

它可以在良好的浏览器(壁虎、webkit)中运行,但 jQuery 在将 .innerHTML 与 HTML5 元素结合使用时存在一个已知错误,记录在 here.replaceWith 最终在内部使用该方法。


一种解决方案是使用原生 Javascript 和除 .innerHTML 之外的方法。像这样的东西应该可以工作:

$victim.parent().get(0).insertBefore($fresh.get(0), $victim.get(0));

确实如此,但仅限于优秀的浏览器。 $fresh var 上的 .get(0) 方法有些问题。

我在 js 代码中模拟了插入本地创建的节点,它在 IE 中工作:

var dummy = document.createElement('article');
    var dummyChild = document.createElement('header');
        txt = document.createTextNode("crap");
        dummyChild.appendChild(txt);
dummy.appendChild(dummyChild);

$victim.parent().get(0).insertBefore(dummy, $victim.get(0));

那么,还有其他方法可以将字符串转换为 DOM 子树吗?或者任何其他方式来解决 replaceWith 问题?

注意:我不是 javascript 大师/忍者 :)


好的,经过更多阅读后,我想我已经找到了 .insertBefore 不起作用的原因。

正如 jQuery API 所述 (http://api.jquery.com/jQuery/#creating-new-elements),当我将 &lt;article&gt; 作为字符串传递时,由于其复杂性,DOM 元素也是通过 .innerHTML 创建的。

有没有办法强制$() 使用本机 createElement 代替?我知道它在性能方面很糟糕,但至少它会让 IE 正常工作。

【问题讨论】:

  • 我真的不会使用新的 HTML5 元素。现在还为时过早:HTML5 甚至还没有完成,更不用说 IE 问题了。 &lt;header&gt;&lt;footer&gt; 元素在脚本页面上下文中并没有真正为您提供任何有用的东西。
  • 我反对这种想法 :) HTML5 已经准备好满足我的需求了。可悲的是,像这样的复杂情况在 IE 中失败了(就像许多其他事情一样)。顺便说一句,我不只使用页眉和页脚(在整个网站上):)

标签: javascript jquery ajax html innerhtml


【解决方案1】:

您的错误实际上可能比您想象的更早发生。当您将basket.shift() 包装在$() 中时,它实际上正在被添加到隐藏的div 中。你有没有试过这个:

var $victim = $slider.find('article.loading:first'); 
    fresh = basket.shift();

$victim.replaceWith(fresh);

【讨论】:

  • 是的,错误发生在$() 函数调用上,就像我在上次编辑中所说的那样:) 如果我给replaceWith 一个字符串,也会发生同样的事情,它会首先处理字符串,然后替换。
【解决方案2】:

IE 在处理 HTML5 元素时会导致错误,因此请尝试从此页面下载脚本并将其包含在文档头部的任何其他元素之前: http://html5doctor.com/how-to-get-html5-working-in-ie-and-firefox-2/

这应该可以防止由 IE 中的 HTML5 元素引起的错误

【讨论】:

  • HTML5 shiv 没有涵盖这一点。它只是创建元素以启用样式。顺便说一句,我用它。
猜你喜欢
  • 2020-08-16
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2021-03-03
相关资源
最近更新 更多