如何正确使用innerHTML

时间:2012-03-23 18:18:16

标签: javascript html xslt

我有一个链接,当我点击它时会调用带有字符串参数的javascript函数。该字符串实际上是一个a-tag + script-tag,如:

<a>..</a><script>...</scipt>

显示视频文件。

所以无论如何,javascript函数应该创建该代码,并使视频显示在页面上,但是当我按下链接时出现的是一串代码,因此它显示为文本(但是它是一个超链接)而不是执行成为视频。

任何人都知道为什么?

很奇怪,因为如果我复制代码(显示为文本),并将其粘贴到编辑器中,就像正常一样,那么视频会显示......

<a title="Click to Show Video" href='javascript:void(0);' onclick="switchFunc('{$thisNode/@*[name()=current()/@Name]}');">
    <div dir="{@Direction}" class="ms-rtestate-field">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes"/>
    </div>
</a>




<script type="text/javascript"> 
  function switchFunc(source) {
    document.getElementById('videoContainer').innerHTML = source;
  }  
</script>

<div id="videoContainer">    </div>

3 个答案:

答案 0 :(得分:1)

正如我在评论中所说,我怀疑您的属性正在编码,因此您可以尝试以下操作:

<a title="Click to Show Video" href='javascript:void(0);' >
<xsl:attribute name="onclick">switchFunc('<xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes"/>');</xsl:attribute>
    <div dir="{@Direction}" class="ms-rtestate-field">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes"/>
    </div>
</a>

答案 1 :(得分:0)

为什么不用你想要的标签更新innerHtml,并通过eval运行javascript?

我不完全确定它的xslt部分,但想法是分解你的两个部分(你曾说过这真的是<a>Anchor</a><script>Javascript</script>

HTML

<a title="Click to Show Video" 
    href='javascript:void(0);' 
    onclick="switchFunc('<a>Anchor</a>','Javascript');">

JS

<script type="text/javascript"> 
  function switchFunc(htmlValue, javascriptMethodCall) {
    document.getElementById('videoContainer').innerHTML = htmlValue;
    eval(javascriptMethodCall);
  }  
</script>

答案 2 :(得分:0)

无论输出转义设置如何,属性值总是被转义,因为内容可能会破坏XML文件的良好状态。

无论如何,核心架构在多种方面存在问题。首先,它将一些简单的客户端功能移动到服务器。另外,通过这种方式,您可以将页面的主要内容(视频网址)封装到脚本代码中,从而将其隐藏在索引器之外。

我是XSLT的一大乐趣,但代码的怪异外观和易读性告诉我某些事情不行。

一种可能的解决方案是注释方法:渲染列表,其中包含存储作为数据属性的关键信息的项目,并让javascript代码(您自己的或客户端模板引擎)构建输出。