Javascript 不允许firefox加载项innerHTML,需要DOM帮助

Javascript 不允许firefox加载项innerHTML,需要DOM帮助,javascript,dom,firefox-addon,Javascript,Dom,Firefox Addon,我正在编写我的第一个firefox插件。 它已经完成了,但mozilla拒绝了它,并给出了以下答案: 1) 您的加载项通过指定给innerHTML或通过类似方式,从包含潜在未初始化数据的HTML字符串创建DOM节点。除了效率低下之外,这也是一个重大的安全风险。有关详细信息,请参阅。下面是一些这样做的示例:(剪切…) 我写道: var myDiv = content.document.getElementById("myContent"); myDiv.innerHTML = "some html

我正在编写我的第一个firefox插件。 它已经完成了,但mozilla拒绝了它,并给出了以下答案:

1) 您的加载项通过指定给innerHTML或通过类似方式,从包含潜在未初始化数据的HTML字符串创建DOM节点。除了效率低下之外,这也是一个重大的安全风险。有关详细信息,请参阅。下面是一些这样做的示例:(剪切…)

我写道:

var myDiv = content.document.getElementById("myContent");
myDiv.innerHTML = "some html code";
现在我不是一个JS程序员,我不知道如何继续下去。 我测试了如下一些代码:

var NewNode = content.document.createElement("span");
NewNode.appendChild(content.document.createTextNode("Hello World!"));                   

//content.document.body.appendChild(NewNode);//ok, works
content.document.getElementById("myContent").appendChild(NewNode);//doesn't work
但直到我把它附加到.body之后它才起作用

其他页面上的示例在这里似乎不起作用。此外,我不明白它是否解决了mozilla指出的问题

你能帮我用代码替换我写的两行吗? 如果您需要完整的代码,请参阅:

谢谢!
娜迪亚

好吧,我做了一些挖掘,我想我找到了你的问题:

每当您想向扩展注入任何类型的html时,浏览器都会将其视为一个安全漏洞,这就是您遇到此问题的原因。你有两种不同的解决方案

首先:您可以创建一个iframe并使用它来显示html(在javascript中,每当我们想要显示文件时,我们有2个选项,首先在服务器上传递一个文件路径,或者使用
数据:
直接显示您的数据):


这是我要指出的第一条线索。

刚刚做了一个快速的js提琴,我想知道你为什么使用content.document,所以我将它修改为document,它成功了

我对未初始化的HTML也有类似的问题,在我广泛使用它时,我选择使用jQuery,它将传递mozillas规则。这样可以更轻松地创建节点

$("<div>", {id:"example"}).text("Hello World")
$(“”,{id:“示例”}).text(“Hello World”)

它读起来真是太好了。

你似乎把最后两行都放在一起了?这意味着您正在将新节点附加到两个不同的父节点。删除
content.document.body.appendChild(NewNode)然后再检查一次。不,我试着用拳头打body,但它有效,然后评论它,使用第二行,但无效。(我修复了上面的文本)您是否检查了
content.document.getElementById(“myContent”)
是否实际返回了您期望的内容?是的,它可以工作,我有一个“.innerHTML”在上面,它工作正常,但我无法使用。innerHTML@Nadia:我设法找到了你的解决方案,下一个正在进行中,请查看,我在firefox扩展中使用content.document,如果调用document,我在getElementById上会得到一个“null”结果。jQuery不能在插件sdk使用的扩展中调用,插件sdk允许所有这些功能。也许您需要将“内容”添加到最后一行,在那里添加新节点。“内容”只是一个报告错误,如下文所述,它无论如何都不起作用。关于插件sdk,我不是JS程序员,我也不知道如何开始使用它。我刚刚找到了一个非常简单的插件示例,并对其进行了修改以满足我的需要。它可以工作,但mozilla不允许我使用innerHtmlyes,它是针对ebay.It用户的,我保存了一个测试页面,你可以在这里找到它:如果你在js文件中添加,在找到myPage.indexOf(“.ebay.It/ws/eBayISAPI.dll?EditSalesRecord&”)的两行(“.ebay.It/ws/eBayISAPI.dll?EditSalesRecord&”)上-1这个:| | myPage.indexOf(“maipiusenza.com/LDV/test/test/test.htm”)>-1它也可以在这个页面上工作,(你会在买家详细信息前看到一个flash框)对不起,我在报告代码时犯了错误(因为我做了很多尝试)。我也使用了你的代码(我会在问题中更正我的代码),它没有给出错误,但页面中没有添加任何内容。如果我在普通html页面中测试相同的脚本,它会起作用。它在firefox扩展中不起作用。不可能:-(第一种解决方案:没有错误,但根本没有输出。第二种解决方案:如果我使用它而没有更改,我会得到一个"未定义使用document而不是content.document的位置;如果我替换它,则没有错误,但没有输出。关于第一条线索,这只是报告代码时出错,我始终使用content.document,但根本没有结果。在正常页面上,所有操作都正常,但在add.On中,该代码不正常work@Nadia当前位置两种解决方案我都做了同样的事情,创建了一个简单的firefox插件,并将其安装在我的firefox上,我得到了结果。你能给我发送你的代码或xpi文件吗?链接在问题中,这里再次链接,否则你能给我发送你的xpi,我会尝试修改它吗?正如你所看到的,我的代码非常简单。非常感谢!嗨,你找到了解决方案吗?谢谢
var htmlStr = "<span>Hello World!</span>";
var frm = document.createElement("iframe");
frm.style.display="none";
document.body.appendChild(frm);

var win = frm.contentWindow;
var frmrange = win.document.createRange();
// make the parent of the first div in the document becomes the context node
frmrange.selectNode(win.document.firstChild);
var frg = frmrange.createContextualFragment(htmlStr);
content.document.getElementById("myContent").appendChild(frg);
var NewNode = content.document.createElement("span");
NewNode.appendChild(content.document.createTextNode("Hello World!"));

content.document.getElementById("myContent").appendChild(NewNode);
var NewNode = document.createElement("span");
NewNode.appendChild(document.createTextNode("Hello World"));
document.getElementById("myContent").appendChild(NewNode);
$("<div>", {id:"example"}).text("Hello World")