CKEditor主体上的Document.getElementById返回null

时间:2014-05-08 00:03:20

标签: javascript jquery ckeditor salesforce visualforce

我需要将Salesforce提供的富文本编辑器的拼写检查属性设置为true。但是,指定了该属性的正文组件始终返回null。

由于这个原因,我无法更改属性值。我究竟做错了什么?我甚至无法使用jQuery选择器。

<apex:page >
  <apex:form >
    <apex:inputTextarea richText="true" id="rta"/>
  </apex:form>
  <script>
    alert(document.getElementById('j_id0:j_id1:rta_rta_body'));
  </script>
</apex:page>

1 个答案:

答案 0 :(得分:0)

太早了。

遇到此行代码后,此脚本将立即触发。那时原始<textarea>仍然存在于页面上,并且装饰器没有运行(装饰器隐藏原始标签并且用整个RTF编辑器注入<iframe>)。您可以验证它,因为执行在显示此alert()时停止。

最干净的方法是覆盖onload函数(或装饰器运行的任何地方),类似于这些帖子的用法:

  1. http://bobbuzzard.blogspot.co.uk/2011/05/onload-handling.html
  2. https://developer.salesforce.com/forums?id=906F0000000957DIAQ
  3. 不确定为什么,但似乎即使是这样的自定义onload太快了(我没有时间进一步调试)。

    所以,尽管它很丑陋 - 这似乎对我有用:

    <apex:page >
        <apex:form >
            <apex:inputTextarea richText="true" id="rta"/>
        </apex:form>
        <script>
        function setSpellChecker(){
            var iframe = document.getElementById('j_id0:j_id1:rta_frame');
            var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
            iframeDocument.getElementsByTagName('body')[0].spellcheck = true;
        }
        window.setTimeout(setSpellChecker, 1000); // fire after 1 second
        </script>
    </apex:page>
    

    如果你愿意的话,请随意尝试用jQuery的contents()进行美化...这里有很多问题如何使用jQuery很好地访问iframe,例如How to get the body's content of an iframe in Javascript?