Firefox附加组件验证提供了document.write& innerHTML错误

时间:2013-11-26 12:26:18

标签: javascript firefox firefox-addon

我写了一个firefox附加组件来拉取并显示一个rss feed。这是我的原始代码。

feed.load(function(result) {
    if (!result.error) {
      var container = document.getElementById("feed");
      var html = "";
      for (var i = 0; i < result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        html = "<h5>" + "<a href='" + entry.link + "'>" + entry.title + "</a></h5>";
        var div = document.createElement("div");
        div.innerHTML = html;
        container.appendChild(div);            
      }
      document.write(html);
    }
  });

它工作正常,当我上传到firefox网站时,验证发出2次警告。

  1. 不应将标记动态传递给innerHTML
  2. 警告:由于安全性和性能原因,不应使用动态值设置innerHTML。这可能导致安全问题或相当严重的性能下降。

    var div = document.createElement("div");
    div.innerHTML = html;
    container.appendChild(div);
    
    1. 强烈建议不要使用document.write
    2. 警告:document.write在许多情况下会在扩展中使用时失败,并且在使用不当时可能会产生严重的安全后果。因此,不应该使用它。有关详细信息,请参阅https://developer.mozilla.org/docs/XUL/School_tutorial/DOM_Building_and_HTML_Insertion

      }
        document.write(html);
      }
      

      所以重写了代码,它不再显示任何东西了。知道我做错了吗?

      feed.load(function(result) {
              if (!result.error) {
                var container = document.getElementById("feed");
                var html = "";
                for (var i = 0; i < result.feed.entries.length; i++) {
                  var entry = result.feed.entries[i];
                  html = "<h5>" + "<a href='" + entry.link + "'>" + entry.title + "</a></h5>";
                  eUL = document.createElement("h5");
                  eAnchor = document.createElement("a");
                  eAnchor.setAttribute("href",entry.link);
                  eAnchor.appendChild(document.createTextNode(entry.title));
                  eUL.appendChild(eAnchor); 
                  document.getElementById("container").appendChild(eUL);           
                }
                var bd = document.getElementsByTagName('body')[0];
                bd.appendChild(html);
              }
            });
      

1 个答案:

答案 0 :(得分:1)

在您的原始代码和修改过的代码中,看起来您要将元素添加两次 - 一次添加到容器,一次添加到正文。您可能只想将其添加到容器中,在这种情况下,修改后的代码应如下所示:

feed.load(function(result) {
    if (!result.error) {
      var container = document.getElementById("feed");
      for (var i = 0; i < result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        eUL = document.createElement("h5");
        eAnchor = document.createElement("a");
        eAnchor.setAttribute("href",entry.link);
        eAnchor.appendChild(document.createTextNode(entry.title));
        eUL.appendChild(eAnchor); 
        container.appendChild(eUL);           
      }
    }
});

在不知道您的Feed或包含文档的结构的情况下,它无法确定这是否有效,但它是朝着正确方向迈出的一步。如果仍有问题,请检查错误控制台。