Changeset 8175 for trunk/src/html

Show
Ignore:
Timestamp:
04/19/07 07:12:07 (21 months ago)
Author:
liucougar
Message:

fixed contentEditable issue
added enable property initial value
updated plugins to work correctly

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/html/range.js

    r8015 r8175  
    149149} 
    150150 
     151dojo.html.range.adjacentNoneTextNode=function(startnode, next){ 
     152        var node = startnode; 
     153        var len = (0-startnode.length) || 0; 
     154        var prop = next?'nextSibling':'previousSibling'; 
     155        while(node){ 
     156                if(node.nodeType!=3){ 
     157                        break; 
     158                } 
     159                len += node.length 
     160                node = node[prop]; 
     161        } 
     162        return [node,len]; 
     163} 
    151164 
    152165dojo.html.range._w3c = Boolean(window['getSelection']); 
     
    163176                return win.getSelection(); 
    164177        }else{//IE 
    165                 if(!dojo.html.range.ie.cachedSelection[win]){ 
     178                var id=win.__W3CRange; 
     179                if(!id || !dojo.html.range.ie.cachedSelection[id]){ 
    166180                        var s = new dojo.html.range.ie.selection(win); 
    167                         dojo.html.range.ie.cachedSelection[win] = s; 
    168                 }else{ 
    169                         var s = dojo.html.range.ie.cachedSelection[win]; 
     181                        //use win as the key in an object is not reliable, which 
     182                        //can leads to quite odd behaviors. thus we generate a 
     183                        //string and use it as a key in the cache 
     184                        id=(new Date).getTime(); 
     185                        while(id in dojo.html.range.ie.cachedSelection){ 
     186                                id=id+1; 
     187                        } 
     188                        id=String(id); 
     189                        dojo.html.range.ie.cachedSelection[id] = s; 
     190                }else{ 
     191                        var s = dojo.html.range.ie.cachedSelection[id]; 
    170192                } 
    171193                if(!ignoreUpdate){ 
     
    175197        } 
    176198} 
    177  
     199                 
    178200if(!dojo.html.range._w3c){ 
    179201        dojo.html.range.ie={ 
     
    202224                                        //TODO: multiple range selection(?) 
    203225                                        return new dojo.html.range.W3CRange(dojo.html.range.ie.decomposeControlRange(r)); 
    204                                 }else if(type=="TEXT"){ 
     226                                }else{ 
    205227                                        return new dojo.html.range.W3CRange(dojo.html.range.ie.decomposeTextRange(r)); 
    206                                 }else{ //NONE 
    207                                         return null; 
    208228                                } 
    209229                        }; 
     
    265285                //                      try{ 
    266286                                                if(calOffset && startnode){ 
    267                                                         var prevnode = dojo.html.range.ie.adjacentNoneTextNode(startnode)[0]; 
     287                                                        var prevnode = dojo.html.range.adjacentNoneTextNode(startnode)[0]; 
    268288                                                        if(prevnode){ 
    269289                                                                startnode = prevnode.nextSibling; 
     
    271291                                                                startnode = parentNode.firstChild; //firstChild must be a text node 
    272292                                                        } 
    273                                                         var prevnodeobj = dojo.html.range.ie.adjacentNoneTextNode(startnode); 
     293                                                        var prevnodeobj = dojo.html.range.adjacentNoneTextNode(startnode); 
    274294                                                        prevnode = prevnodeobj[0]; 
    275295                                                        var lenoffset = prevnodeobj[1]; 
     
    304324                        } 
    305325                        return [startnode, startOffset]; 
    306                 }, 
    307                 adjacentNoneTextNode: function(startnode, next){ 
    308                         var node = startnode; 
    309                         var len = (0-startnode.length) || 0; 
    310                         var prop = next?'nextSibling':'previousSibling'; 
    311                         while(node){ 
    312                                 if(node.nodeType!=3){ 
    313                                         break; 
    314                                 } 
    315                                 len += node.length 
    316                                 node = node[prop]; 
    317                         } 
    318                         return [node,len]; 
    319326                }, 
    320327                setEndPoint: function(range, container, offset){ 
     
    361368                        } 
    362369                        if(container.nodeType==3){ 
    363                                 var prevnodeobj = dojo.html.range.ie.adjacentNoneTextNode(container); 
     370                                var prevnodeobj = dojo.html.range.adjacentNoneTextNode(container); 
    364371                                var prevnode = prevnodeobj[0], len = prevnodeobj[1]; 
    365372                                if(prevnode){ 
    366373                                        atmrange.moveToElementText(prevnode); 
    367374                                        atmrange.collapse(false); 
     375                                        //if contentEditable is not inherit, the above collapse won't make the end point 
     376                                        //in the correctly position: it always has a -1 offset, so compensate it 
     377                                        if(prevnode.contentEditable!='inherit'){ 
     378                                                len++; 
     379                                        } 
    368380                                }else{ 
    369381                                        atmrange.moveToElementText(container.parentNode); 
    370382                                        atmrange.collapse(true); 
    371383                                } 
     384 
    372385                                offset += len; 
    373386                                if(offset>0){