Changeset 8175 for trunk/src/html
- Timestamp:
- 04/19/07 07:12:07 (21 months ago)
- Files:
-
- 1 modified
-
trunk/src/html/range.js (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/html/range.js
r8015 r8175 149 149 } 150 150 151 dojo.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 } 151 164 152 165 dojo.html.range._w3c = Boolean(window['getSelection']); … … 163 176 return win.getSelection(); 164 177 }else{//IE 165 if(!dojo.html.range.ie.cachedSelection[win]){ 178 var id=win.__W3CRange; 179 if(!id || !dojo.html.range.ie.cachedSelection[id]){ 166 180 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]; 170 192 } 171 193 if(!ignoreUpdate){ … … 175 197 } 176 198 } 177 199 178 200 if(!dojo.html.range._w3c){ 179 201 dojo.html.range.ie={ … … 202 224 //TODO: multiple range selection(?) 203 225 return new dojo.html.range.W3CRange(dojo.html.range.ie.decomposeControlRange(r)); 204 }else if(type=="TEXT"){226 }else{ 205 227 return new dojo.html.range.W3CRange(dojo.html.range.ie.decomposeTextRange(r)); 206 }else{ //NONE207 return null;208 228 } 209 229 }; … … 265 285 // try{ 266 286 if(calOffset && startnode){ 267 var prevnode = dojo.html.range. ie.adjacentNoneTextNode(startnode)[0];287 var prevnode = dojo.html.range.adjacentNoneTextNode(startnode)[0]; 268 288 if(prevnode){ 269 289 startnode = prevnode.nextSibling; … … 271 291 startnode = parentNode.firstChild; //firstChild must be a text node 272 292 } 273 var prevnodeobj = dojo.html.range. ie.adjacentNoneTextNode(startnode);293 var prevnodeobj = dojo.html.range.adjacentNoneTextNode(startnode); 274 294 prevnode = prevnodeobj[0]; 275 295 var lenoffset = prevnodeobj[1]; … … 304 324 } 305 325 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.length316 node = node[prop];317 }318 return [node,len];319 326 }, 320 327 setEndPoint: function(range, container, offset){ … … 361 368 } 362 369 if(container.nodeType==3){ 363 var prevnodeobj = dojo.html.range. ie.adjacentNoneTextNode(container);370 var prevnodeobj = dojo.html.range.adjacentNoneTextNode(container); 364 371 var prevnode = prevnodeobj[0], len = prevnodeobj[1]; 365 372 if(prevnode){ 366 373 atmrange.moveToElementText(prevnode); 367 374 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 } 368 380 }else{ 369 381 atmrange.moveToElementText(container.parentNode); 370 382 atmrange.collapse(true); 371 383 } 384 372 385 offset += len; 373 386 if(offset>0){