我在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 ...")
中的_setContentAttr
和domNode._addtext("etc")
中的textSrc
,结果是相同的。同样,我替换了当我使用textSrc
调用该窗口小部件的内容时的实例,反之亦然,只有textSrc成功了。这意味着这不是CSS问题。我的猜测是,它与deferred有关,因为xhr推迟了textSrc
addText
命令的执行,而内容没有执行。谁能向我解释发生了什么事以及如何解决这个问题?编辑:所以我认为我将问题隔离到小部件中domNode的
offsetHeight
,clientHeight
不活动,因为可能尚未呈现html。延迟URL之所以起作用,是因为那时渲染已经完成。但是我仍然找不到合理的解决方案。 postCreate
事件由于某些原因无法正常工作。有人知道解决方法吗?谢谢! 最佳答案
好吧,我知道了。因此,我怀疑和postCreate
发生在小部件的变量创建期间。该窗口小部件的容器使用_set(something)Attr
命令将窗口小部件放入其中。但是,在调用placeAt
之前先调用_addText(...)
,因此小部件在页面上甚至不存在时都在计算placeAt
。我要做的就是在小部件的容器clientHeight
调用之后移动_addText(...)
调用,一切正常。