Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果输入位于HTML命名空间中且属性值包含JS,Chrome 39 XSLTProcessor将返回null_Javascript_Google Chrome_Xslt - Fatal编程技术网

Javascript 如果输入位于HTML命名空间中且属性值包含JS,Chrome 39 XSLTProcessor将返回null

Javascript 如果输入位于HTML命名空间中且属性值包含JS,Chrome 39 XSLTProcessor将返回null,javascript,google-chrome,xslt,Javascript,Google Chrome,Xslt,长话短说,我正在开发一个Chrome扩展,它将XSL转换应用于网页的DOM。这是可行的,除非是在非常特殊的情况下;如果属性值包含内联Javascript,即以字符串Javascript:开头,并且该值的其余部分包含小于符号,即使该符号已正确转义 示例-工作代码: xml = '\ <p xmlns="http://www.w3.org/1999/xhtml">\ <a href="javascript:foo bar">my link</a>\

长话短说,我正在开发一个Chrome扩展,它将XSL转换应用于网页的DOM。这是可行的,除非是在非常特殊的情况下;如果属性值包含内联Javascript,即以字符串Javascript:开头,并且该值的其余部分包含小于符号,即使该符号已正确转义

示例-工作代码:

xml = '\
  <p xmlns="http://www.w3.org/1999/xhtml">\
    <a href="javascript:foo bar">my link</a>\
  </p>';

xsl = '<?xml version="1.0"?>\
  <xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
  <xsl:output version="1.0" method="xml" />\
  </xsl:stylesheet>';

parse = new DOMParser();
xmlDOM = parse.parseFromString(xml, 'text/xml');
xslDOM = parse.parseFromString(xsl, 'text/xml');

xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xslDOM);
result = xsltProc.transformToFragment(xmlDOM, document);
…这将导致转换失败,结果将为空

这个问题的触发因素非常具体。包含javascript:prefix和小于符号的属性必须位于[X]HTML命名空间中,并且只有通常包含URL的属性才会受到影响,因此除了a@href, iframe@src, script@src和img@src都受到了影响

如果值的前缀不是javascript:,则不会发生此问题

这个问题在命令行xsltproc或Firefox中似乎也没有出现

所以我的问题很简单:为什么会发生这种情况

我想一个明显的后续问题是,这是否允许在XSL中嵌入和执行Javascript


万一有人想知道。。。是的,很难找出是什么触发了这一切D

在您的示例中,属性不在名称空间中,它是XHTML名称空间中的a元素的属性,但属性本身肯定不在名称空间中。所以我不明白你为什么说属性。。。必须在[X]HTML命名空间中。我创建了,可以确认它在Chrome39中不起作用。我认为这是Chrome中的一个bug,transformToFragment应该始终返回一个文档片段,并且不为null,除非转换抛出错误,但是Chrome不会显示错误,只有片段上的最后一个子元素给出错误。我还创建了至少可以进行转换的地方,尽管Chrome在单击链接时不显示javascript href的结果。最后显示Chrome在静态HTML中单击此类链接时甚至不显示javascript:href的结果。Re命名空间,是的,你是对的。我的意思是父对象必须位于HTML命名空间中。因此,在我的示例中,如果我们将输入XML中的xmlns声明更改为,那么转换将成功,也就是说,按照预期工作。从我有限的测试看来,属性的值并不像预期的那样重要。。。它只是一个文本节点,但只有当该值与regexp/^\s*javascript:匹配时才会触发该错误*
    <a href="javascript:foo &lt;bar">my link</a>\