我在JavaScript + dojo中有一段代码有问题。我正在制作一个给定高度和字符串的小部件,如果字符串溢出,则该小部件将在该字符串的末尾显示省略号。有两种使用此小部件的方法,您既可以向其提供实际的字符串,也可以为其提供指向文本文件的URL。

问题是,如果将实际的字符串提供给窗口小部件,它将失败,但是如果给它提供URL,它将完美地工作。这是代码:

define(["dojo/_base/declare","dijit/_WidgetBase", "dijit/_TemplatedMixin", "dojo/text!./template/template.html", "dojo/_base/xhr", "dojo/dom-style", "dojo/_base/lang"],

function(declare, WidgetBase, TemplatedMixin, template, xhr, domStyle, lang){

 return declare([WidgetBase, TemplatedMixin], {

        templateString: template,

        textSrc: "",

        content: "",

        height: 100,

        ellipsis: "...",

        endPoint: "Read more...",

        postCreate: function(){
            this.inherited(arguments);

        },

        _setHeightAttr: function(av) {
            this._set("height", av);
            domStyle.set(this.domNode, "height", this.height +"px");
        },

        _setContentAttr: function(av) {
            this._set("content", av);
            if(this.content!=""){
            this._addText(this.content);
            }
        },

        _setTextSrcAttr: function(av) {

            this._set("textSrc", av);
            if(this.textSrc!=""){
                var articleText = xhr.get({
                    url: this.textSrc,
                    handleAs: "text"
                });
                var domNode = this;
                articleText.then( function(text){
                    domNode._addText(text);
                });
            }
        },

        _addText: function(text){
            var index = 0;

            while( this.measureNode.scrollHeight < this.height && index < text.length )
            {
                this.containerNode.innerHTML += text.charAt(index);
                index++;
            }

            if(index < text.length){
                this.containerNode.innerHTML = text.substring(0,index-1);
            }
            else{
                this.ellipsisNode.innerHTML = "";
                this.endPointNode.innerHTML = "";
            }
        }

    });
})


因此,从本质上讲,此小部件的工作方式是:如果我调用content而不是textSrc,则内容中的字符串将发送到addText()进行显示。否则,xhr读取textSrc的URL,并将URL中的字符串发送到addText()addText()从字符串中添加一个字符,直到measureNode的高度超过所需的高度(containerNode在measureNode中)或没有剩余的字符为止。末尾会有一个省略号和“更多”锚点的空间。现在的问题是,使用内容永远不会起作用,这是一些“症状”


即使有溢出也会显示整个字符串
原因是this.measureNode.scrollHeight始终为0。这很奇怪,因为当我将其与textSrc的URL一起使用时,它会产生预期的数字。


我只给textSrc和content提供了一个字符串,所以类似this._addText("blah blah blah blah ...")中的_setContentAttrdomNode._addtext("etc")中的textSrc,结果是相同的。同样,我替换了当我使用textSrc调用该窗口小部件的内容时的实例,反之亦然,只有textSrc成功了。这意味着这不是CSS问题。我的猜测是,它与deferred有关,因为xhr推迟了textSrc addText命令的执行,而内容没有执行。谁能向我解释发生了什么事以及如何解决这个问题?

编辑:所以我认为我将问题隔离到小部件中domNode的offsetHeightclientHeight不活动,因为可能尚未呈现html。延迟URL之所以起作用,是因为那时渲染已经完成。但是我仍然找不到合理的解决方案。 postCreate事件由于某些原因无法正常工作。有人知道解决方法吗?谢谢!

最佳答案

好吧,我知道了。因此,我怀疑和postCreate发生在小部件的变量创建期间。该窗口小部件的容器使用_set(something)Attr命令将窗口小部件放入其中。但是,在调用placeAt之前先调用_addText(...),因此小部件在页面上甚至不存在时都在计算placeAt。我要做的就是在小部件的容器clientHeight调用之后移动_addText(...)调用,一切正常。

10-08 17:54