javascript 一段代碼引發(fā)的思考第1/2頁(yè)
更新時(shí)間:2009年01月01日 15:30:50 作者:
寫在前面:這是一個(gè)關(guān)于Ext, Prototype, JavaScript方面的問(wèn)題,其實(shí)下面遇到的問(wèn)題本不是問(wèn)題,都是因?yàn)殄e(cuò)誤的理解造成的,本文的宗旨是希望讀者朋友避免我犯的同類錯(cuò)誤,遇事三思而后行,同時(shí)也體會(huì)下發(fā)現(xiàn)問(wèn)題,解決問(wèn)題,反思問(wèn)題這種精神活動(dòng)所帶來(lái)的快樂(lè)!
在2008年的最后一天,在此祝愿大家元旦快樂(lè)!!!
鄭重聲明:此問(wèn)題根本不是問(wèn)題,現(xiàn)在看來(lái)就是本人知識(shí)匱乏,庸人自擾,望廣大朋友勿噴!!
細(xì)心發(fā)現(xiàn)問(wèn)題,耐心解決問(wèn)題,信心面對(duì)問(wèn)題.
作者:白某人
長(zhǎng)話短說(shuō):”服務(wù)員,上代碼....”
測(cè)試代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
以下是在IE下的測(cè)試.我所期望的結(jié)果是(旁白:我已經(jīng)開始犯錯(cuò)了):
<div id="div88">this is div88</div>
<div id="div2">this is div2</div>
<div id="div3">this is div3</div>
實(shí)際結(jié)果:
<div id="div88">this is div88</div>
問(wèn)題:
Div2,div3 丟了?
發(fā)現(xiàn)問(wèn)題怎么辦?看代碼.
Template.js line:197 (Extjs ver 2.2)
append : function(el, values, returnElement){
return this.doInsert('beforeEnd', el, values, returnElement);
}
在看 line201:
doInsert : function(where, el, values, returnEl){
el = Ext.getDom(el);
var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
return returnEl ? Ext.get(newNode, true) : newNode;
}
在在看:DomHelper.js line:267
insertHtml : function(where, el, html){
where = where.toLowerCase();
if(el.insertAdjacentHTML){
if(tableRe.test(el.tagName)){
var rs;
if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){
return rs;
}
}
switch(where){
case "beforebegin":
el.insertAdjacentHTML('BeforeBegin', html);
return el.previousSibling;
case "afterbegin":
el.insertAdjacentHTML('AfterBegin', html);
return el.firstChild;
case "beforeend":
el.insertAdjacentHTML('BeforeEnd', html);
return el.lastChild;
case "afterend":
el.insertAdjacentHTML('AfterEnd', html);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}
//////后面省略
}
原來(lái)還是用的insertAdjacentHTML方法,為什么會(huì)有問(wèn)題呢?
輸出中間代碼:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").innerHTML;
//.........
結(jié)果如下:
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
?????? 為什么會(huì)這樣? “this is div1”兩邊的<div>標(biāo)簽?zāi)?
在測(cè)試:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").outerHTML;
//.........
結(jié)果如下:
<DIV id=div1>
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
</DIV>
(旁白:本來(lái)到這就已經(jīng)能發(fā)現(xiàn)問(wèn)題所在了,但執(zhí)迷不悟,繼續(xù)犯錯(cuò))
原來(lái)它把div2,div3插到div1的value/text 后邊了.所以運(yùn)行tpl.overwrite('div1',{id:'88'});后div2,div3沒(méi)了.
在此附上tpl.overwrite源碼(innerHTML直接賦值):
overwrite : function(el, values, returnElement){
el = Ext.getDom(el);
el.innerHTML = this.applyTemplate(values);
return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
}
問(wèn)題知道了,可怎么辦呢,改Ext源碼?
鄭重聲明:此問(wèn)題根本不是問(wèn)題,現(xiàn)在看來(lái)就是本人知識(shí)匱乏,庸人自擾,望廣大朋友勿噴!!
細(xì)心發(fā)現(xiàn)問(wèn)題,耐心解決問(wèn)題,信心面對(duì)問(wèn)題.
作者:白某人
長(zhǎng)話短說(shuō):”服務(wù)員,上代碼....”
測(cè)試代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
以下是在IE下的測(cè)試.我所期望的結(jié)果是(旁白:我已經(jīng)開始犯錯(cuò)了):
<div id="div88">this is div88</div>
<div id="div2">this is div2</div>
<div id="div3">this is div3</div>
實(shí)際結(jié)果:
<div id="div88">this is div88</div>
問(wèn)題:
Div2,div3 丟了?
發(fā)現(xiàn)問(wèn)題怎么辦?看代碼.
Template.js line:197 (Extjs ver 2.2)
append : function(el, values, returnElement){
return this.doInsert('beforeEnd', el, values, returnElement);
}
在看 line201:
doInsert : function(where, el, values, returnEl){
el = Ext.getDom(el);
var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
return returnEl ? Ext.get(newNode, true) : newNode;
}
在在看:DomHelper.js line:267
insertHtml : function(where, el, html){
where = where.toLowerCase();
if(el.insertAdjacentHTML){
if(tableRe.test(el.tagName)){
var rs;
if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){
return rs;
}
}
switch(where){
case "beforebegin":
el.insertAdjacentHTML('BeforeBegin', html);
return el.previousSibling;
case "afterbegin":
el.insertAdjacentHTML('AfterBegin', html);
return el.firstChild;
case "beforeend":
el.insertAdjacentHTML('BeforeEnd', html);
return el.lastChild;
case "afterend":
el.insertAdjacentHTML('AfterEnd', html);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}
//////后面省略
}
原來(lái)還是用的insertAdjacentHTML方法,為什么會(huì)有問(wèn)題呢?
輸出中間代碼:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").innerHTML;
//.........
結(jié)果如下:
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
?????? 為什么會(huì)這樣? “this is div1”兩邊的<div>標(biāo)簽?zāi)?
在測(cè)試:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").outerHTML;
//.........
結(jié)果如下:
<DIV id=div1>
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
</DIV>
(旁白:本來(lái)到這就已經(jīng)能發(fā)現(xiàn)問(wèn)題所在了,但執(zhí)迷不悟,繼續(xù)犯錯(cuò))
原來(lái)它把div2,div3插到div1的value/text 后邊了.所以運(yùn)行tpl.overwrite('div1',{id:'88'});后div2,div3沒(méi)了.
在此附上tpl.overwrite源碼(innerHTML直接賦值):
overwrite : function(el, values, returnElement){
el = Ext.getDom(el);
el.innerHTML = this.applyTemplate(values);
return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
}
問(wèn)題知道了,可怎么辦呢,改Ext源碼?
相關(guān)文章
JavaScript中slice和padEnd的使用小結(jié)
本文介紹了JavaScript中slice和padEnd的使用小結(jié),常常被用于數(shù)據(jù)處理、格式化和切割任務(wù)中,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
js iframe跨域訪問(wèn)(同主域/非同主域)分別深入介紹
js跨域是個(gè)討論很多的話題。iframe跨域訪問(wèn)也被研究的很透了,本文今天就叨叨兩句,感興趣的朋友可以了解下,就當(dāng)鞏固知識(shí)了,希望本文對(duì)你有所幫助2013-01-01
基于HTML+JS實(shí)現(xiàn)簡(jiǎn)單的年齡計(jì)算器
JavaScript提供了一些內(nèi)置的日期和時(shí)間函數(shù),有助于從日期(出生日期)開始計(jì)算年齡。本文主要介紹了使用這些JavaScript方法,制作一個(gè)簡(jiǎn)單的年齡計(jì)算器,快來(lái)跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
js判斷登陸用戶名及密碼是否為空的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇js判斷登陸用戶名及密碼是否為空的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

