最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 一段代碼引發(fā)的思考

 更新時間:2009年01月01日 15:30:50   作者:  
寫在前面:這是一個關(guān)于Ext, Prototype, JavaScript方面的問題,其實下面遇到的問題本不是問題,都是因為錯誤的理解造成的,本文的宗旨是希望讀者朋友避免我犯的同類錯誤,遇事三思而后行,同時也體會下發(fā)現(xiàn)問題,解決問題,反思問題這種精神活動所帶來的快樂!

從做項目的角度來看,最好別改,因為你不清楚原作者的想法,容易把問題擴大化.
改源碼不是不行,但那是沒有辦法的辦法,如果能找到其它好的解決方案, 最好別改
(實際上Ext這塊沒有問題,只是我在參照API使用時,混淆了一些概念)
不改源碼,只能找到其它好的解決方案了,用prototype.js看看:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
//tpl.append('div1',{id:'2'});
//tpl.insertAfter('div2',{id:'3'});
Insertion.After($('div1'),tpl.applyTemplate({id:'2'}));
Insertion.After($('div1'),tpl.applyTemplate({id:'3'}));
結(jié)果:
<div id="div88">this is div88</div>
<div id="div2">this is div2</div>
<div id="div3">this is div3</div>
問題解決了......................................
反思:為什么呢?
看代碼 (旁白:問題越引越深)
Prototype.js line:4042 (ver 1.6.0.2)
var Insertion = {
Before: function(element, content) {
return Element.insert(element, {before:content});
},
Top: function(element, content) {
return Element.insert(element, {top:content});
},
Bottom: function(element, content) {
return Element.insert(element, {bottom:content});
},
After: function(element, content) {
return Element.insert(element, {after:content});
}
};
接著看:line:1616
insert: function(element, insertions) {
element = $(element);
...............................
for (var position in insertions) {
content = insertions[position];
position = position.toLowerCase();
insert = Element._insertionTranslations[position];
..............................
return element;
}
在接著看:line:2490
Element._insertionTranslations = {
before: function(element, node) {
element.parentNode.insertBefore(node, element);
},
top: function(element, node) {
element.insertBefore(node, element.firstChild);
},
bottom: function(element, node) {
element.appendChild(node);
},
after: function(element, node) {
element.parentNode.insertBefore(node, element.nextSibling);
},
.............
};
看出區(qū)別了吧:
Ext:
El. insertAdjacentHTML
Prototype:
El.parentNode.insertBefore
Protoype用El.parentNode.insertBefore是考慮兼容性問題, Mozilla不支持El. insertAdjacentHTML,難到Ext沒考慮?( 旁白:思路已經(jīng)完全亂了,逐漸走向迷途的深淵)
在回顧下代碼:DomHelper.js line:267
insertHtml : function(where, el, html){
......
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 + '"';
}
var range = el.ownerDocument.createRange();
var frag;
switch(where){
case "beforebegin":
range.setStartBefore(el);
frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el);
return el.previousSibling;
case "afterbegin":
if(el.firstChild){
range.setStartBefore(el.firstChild);
frag = range.createContextualFragment(html);
el.insertBefore(frag, el.firstChild);
return el.firstChild;
}else{
el.innerHTML = html;
return el.firstChild;
}
case "beforeend":
if(el.lastChild){
range.setStartAfter(el.lastChild);
frag = range.createContextualFragment(html);
el.appendChild(frag);
return el.lastChild;
}else{
el.innerHTML = html;
return el.lastChild;
}
case "afterend":
range.setStartAfter(el);
frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el.nextSibling);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}
從第二部分(第二個switch塊)看的出來,Ext也考慮了,只是如果是ie的話,代碼走不到第二部分.
現(xiàn)在列出case分支與前面方法名的對應(yīng)關(guān)系:
insertFirst:' afterBegin'
insertBefore:' beforeBegin'
insertAfter:' afterEnd'
append:' beforeEnd'
對照上面的代碼,現(xiàn)在看來,歸根到底問題就是我混淆了append,insertAfter.以為append是指在當(dāng)前節(jié)點后面直接追加一個節(jié)點, insertAfter是指把節(jié)點插到當(dāng)前節(jié)點后面.實際上如果是這樣理解的話append,insertAfter不就功能一樣了,那Ext作者寫兩個方法干嘛?.,唉,自己腦殘了,沒仔細(xì)分析代碼就亂用,結(jié)果引出這大長串事.
摘錄:Ext.Template中關(guān)于append,insertAfter方法的說明
Applies the supplied values to the template and appends the new node(s) to el
Applies the supplied values to the template and inserts the new node(s) after el
提示:對于沒看懂的朋友請把第一句的 to 理解成 in 是不是就清晰多了呢.另外,如果對頁面元素操做的話請用Element,上面的insert,append功能它都有.
在多的努力用在了錯誤的方向上,最終的結(jié)果都是零!
唉,
世間本無事, 庸人自擾之.

相關(guān)文章

  • javascript History對象原理解析

    javascript History對象原理解析

    這篇文章主要介紹了javascript History對象原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • JavaScript中slice和padEnd的使用小結(jié)

    JavaScript中slice和padEnd的使用小結(jié)

    本文介紹了JavaScript中slice和padEnd的使用小結(jié),常常被用于數(shù)據(jù)處理、格式化和切割任務(wù)中,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • js iframe跨域訪問(同主域/非同主域)分別深入介紹

    js iframe跨域訪問(同主域/非同主域)分別深入介紹

    js跨域是個討論很多的話題。iframe跨域訪問也被研究的很透了,本文今天就叨叨兩句,感興趣的朋友可以了解下,就當(dāng)鞏固知識了,希望本文對你有所幫助
    2013-01-01
  • 原生js ActiveXObject獲取execl里面的值

    原生js ActiveXObject獲取execl里面的值

    使用原生js獲取execl里面的值,想必有很多的朋友都不會吧,下面有個不錯的方法主要是使用ActiveXObject來實現(xiàn),感興趣的朋友可不要錯過
    2013-11-11
  • Webpack完整打包流程深入分析

    Webpack完整打包流程深入分析

    webpack是一種前端資源構(gòu)建工具,一個靜態(tài)模塊打包器(module bundler),下面這篇文章主要給大家介紹了關(guān)于Webpack完整打包流程的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • PHPExcel中的一些常用方法匯總

    PHPExcel中的一些常用方法匯總

    這篇文章主要介紹了PHPExcel中的一些常用方法匯總,本文直接給出操作代碼實例,代碼中對常用方法給出了注釋,需要的朋友可以參考下
    2015-01-01
  • 基于HTML+JS實現(xiàn)簡單的年齡計算器

    基于HTML+JS實現(xiàn)簡單的年齡計算器

    JavaScript提供了一些內(nèi)置的日期和時間函數(shù),有助于從日期(出生日期)開始計算年齡。本文主要介紹了使用這些JavaScript方法,制作一個簡單的年齡計算器,快來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 微信小程序?qū)崿F(xiàn)點擊圖片放大預(yù)覽

    微信小程序?qū)崿F(xiàn)點擊圖片放大預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)點擊圖片放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • JavaScript中的Proxy對象

    JavaScript中的Proxy對象

    這篇文章主要介紹了JavaScript中的Proxy對象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2020-11-11
  • js判斷登陸用戶名及密碼是否為空的簡單實例

    js判斷登陸用戶名及密碼是否為空的簡單實例

    下面小編就為大家?guī)硪黄猨s判斷登陸用戶名及密碼是否為空的簡單實例。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論

资源县| 栾城县| 历史| 商城县| 湖南省| 石楼县| 千阳县| 泸定县| 乐平市| 新营市| 包头市| 长丰县| 淮阳县| 那坡县| 丹寨县| 灵石县| 青冈县| 温州市| 永德县| 仪陇县| 历史| 本溪| 沁阳市| 荔波县| 潼关县| 清河县| 锡林郭勒盟| 德清县| 武强县| 昭苏县| 天气| 灵台县| 曲周县| 成武县| 彭泽县| 二连浩特市| 阜阳市| 福建省| 同德县| 平乐县| 河东区|