【问题标题】:JavaScript Node assemblingJavaScript 节点组装
【发布时间】:2013-03-11 12:15:59
【问题描述】:

我正在尝试创建一个用于渲染 dom 元素的函数,但我似乎无法在添加之前组装多个 dom 元素。

我试过这个:http://jsfiddle.net/RruyA/1/ 而且我似乎无法用链接包装我的图片。

并且使用现在 innerHTMl 所在的 appendChild()(在小提琴中标有注释)会产生无效指针错误。

我有很多关于可能出了什么问题的理论,但还没有解决方案。帮助会摇滚!

这是完整的代码:

(function () {
    "use strict";

    function tag (name, attributes, contents) {
      var tag = {};
      tag.name = name;
      tag.attributes = attributes;
      tag.contents = contents
      tag.create = function () {
        tag.element = document.createElement(tag.name);
        for (var prop in tag.attributes) {
          tag.element.setAttribute(prop, tag.attributes[prop]);
        }
        // This is the problem:
        tag.element.innerHTML = contents;
      }
      tag.render = function () {
        document.body.appendChild(tag.element);
      }
      return tag;
    }

    var p = tag('p', {'id':'details', 'class':'red nice lovely'}, 'Once upon a time in a golden castle on a silver cloud...');
    var img = tag('img', {'src':'http://miyazakihayao.blog.com/files/2010/05/castle-in-the-sky-x1.jpg', 'width': '200px', 'alt':'Golden Castle'});
    img.create();
    img.render();
    p.create();
    p.render();
    var a = tag('a', {'href':'http://google.com', 'target':'_blank'}, img.element);
    a.create();
    a.render();


}());

【问题讨论】:

  • 你不应该用setAttribute设置类名,而是使用node.className:IE会卡住它。
  • 你知道哪个版本的IE会卡吗?我只支持这个项目的现代浏览器,即 IE9 及更高版本。
  • 我不知道,我最近没有测试这个,我没有IE9。你知道 IE7 还在,不是吗?如果您只支持 IE>=9,您实际上是在锁定 WinXP 用户。
  • 是的,我对这个项目很好。还有大量的 svg 使用和 html5 视频,所以都是 ECMAScript 5,让我的生活变得轻松 :)
  • 我想我找到了 DOM 片段的答案:developer.mozilla.org/en-US/docs/DOM/…

标签: javascript dom


【解决方案1】:

您的问题是您试图以相同的方式添加文本和 HTML 元素。文本可以与 innerHTML 一起正常工作,尽管元素将被强制转换为字符串,appendChild 将添加 HTML 元素,但您需要将字符串包装在 TextNodes 中。

因此您可以在这些类型之间进行选择,并且效果很好。

// This is a solution
if (contents) {
  if (contents instanceof HTMLElement) {
    tag.element.appendChild(contents);
  }
  else {
    tag.element.innerHTML = contents;
  }
}

【讨论】:

  • 你摇滚!我曾在某个时候测试过字符串,但当然 HTMLElements 会测试字符串为阳性。
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多