我在JavaScript + dojo中有一段代碼有問題。我正在製作一個給定一定高度和一個字符串的小部件,如果字符串溢出,小部件會在末尾顯示帶省略號的字符串。有兩種使用這個小部件的方法,你可以將它提供給實際的字符串,或者給它一個文本文件的URL。Dojo省略函數延遲錯誤?
問題是,如果你將實際的字符串提供給小部件,它會失敗,但如果你給它的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 = "";
}
}
});
})
所以基本上這個小部件的工作原理是,如果我打電話的內容,而不是textSrc
,在內容上串被送至addText()
來顯示它。否則,xhr讀取textSrc
的URL並將URL中的字符串發送到addText()
。 addText()
在字符串中添加字符,直到measureNode
高度超過所需高度(containerNode
在measureNode中)或者沒有字符。最後會有一個省略號和一個「多讀」錨點的空間。現在的問題是,使用內容從不工作,這裏是一些「症狀」
- 顯示整個字符串,即使存在溢出
- 的原因是,this.measureNode.scrollHeight始終爲0。這是奇怪的,因爲當我使用它的URL爲
textSrc
時,它會產生預期的數字。
我喂只是一個字符串既textSrc和內容_setContentAttr
和domNode._addtext("etc")
所以像this._addText("blah blah blah blah ...")
在textSrc
,結果是一樣的。此外,我替換了使用textSrc
與內容調用此小部件時的實例,反之亦然,只有textSrc成功。這意味着它不是一個CSS問題。我的猜測是,這與推遲有關,因爲xhr推遲執行textSrc
addText
命令,而內容沒有執行。任何人都可以向我解釋發生了什麼以及我如何解決這個問題?
編輯:所以我覺得我孤立的問題是,小部件中的domNode的offsetHeight
,clientHeight
不活躍,因爲可能html尚未呈現。推遲使用URL是因爲到那時,渲染已完成。但我仍然無法找到合理的解決方案。由於某種原因,postCreate
事件不起作用。任何人都知道解決方法?謝謝!
你知道,CSS可以做一個溢出的省略號,而不需要任何Javascript?或者我錯過了一些與標準CSS選項無關的需求? – Spudley
CSS省略號溢出僅適用於單行div。它會失敗的多行文本,所以我創造了我自己的需求。除此之外,我還需要在CSS無法提供的文本末尾添加「閱讀更多內容」。 –
夠公平的;這就說得通了。我以爲我可能錯過了一些明顯的東西。:) – Spudley