New file |
0,0 → 1,337 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
|
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
|
http://dojotoolkit.org/community/licensing.shtml |
*/ |
|
dojo.require("dojo.html.common"); |
dojo.provide("dojo.html.selection"); |
dojo.require("dojo.dom"); |
dojo.require("dojo.lang.common"); |
dojo.html.selectionType = {NONE:0, TEXT:1, CONTROL:2}; |
dojo.html.clearSelection = function () { |
var _window = dojo.global(); |
var _document = dojo.doc(); |
try { |
if (_window["getSelection"]) { |
if (dojo.render.html.safari) { |
_window.getSelection().collapse(); |
} else { |
_window.getSelection().removeAllRanges(); |
} |
} else { |
if (_document.selection) { |
if (_document.selection.empty) { |
_document.selection.empty(); |
} else { |
if (_document.selection.clear) { |
_document.selection.clear(); |
} |
} |
} |
} |
return true; |
} |
catch (e) { |
dojo.debug(e); |
return false; |
} |
}; |
dojo.html.disableSelection = function (element) { |
element = dojo.byId(element) || dojo.body(); |
var h = dojo.render.html; |
if (h.mozilla) { |
element.style.MozUserSelect = "none"; |
} else { |
if (h.safari) { |
element.style.KhtmlUserSelect = "none"; |
} else { |
if (h.ie) { |
element.unselectable = "on"; |
} else { |
return false; |
} |
} |
} |
return true; |
}; |
dojo.html.enableSelection = function (element) { |
element = dojo.byId(element) || dojo.body(); |
var h = dojo.render.html; |
if (h.mozilla) { |
element.style.MozUserSelect = ""; |
} else { |
if (h.safari) { |
element.style.KhtmlUserSelect = ""; |
} else { |
if (h.ie) { |
element.unselectable = "off"; |
} else { |
return false; |
} |
} |
} |
return true; |
}; |
dojo.html.selectElement = function (element) { |
dojo.deprecated("dojo.html.selectElement", "replaced by dojo.html.selection.selectElementChildren", 0.5); |
}; |
dojo.html.selectInputText = function (element) { |
var _window = dojo.global(); |
var _document = dojo.doc(); |
element = dojo.byId(element); |
if (_document["selection"] && dojo.body()["createTextRange"]) { |
var range = element.createTextRange(); |
range.moveStart("character", 0); |
range.moveEnd("character", element.value.length); |
range.select(); |
} else { |
if (_window["getSelection"]) { |
var selection = _window.getSelection(); |
element.setSelectionRange(0, element.value.length); |
} |
} |
element.focus(); |
}; |
dojo.html.isSelectionCollapsed = function () { |
dojo.deprecated("dojo.html.isSelectionCollapsed", "replaced by dojo.html.selection.isCollapsed", 0.5); |
return dojo.html.selection.isCollapsed(); |
}; |
dojo.lang.mixin(dojo.html.selection, {getType:function () { |
if (dojo.doc()["selection"]) { |
return dojo.html.selectionType[dojo.doc().selection.type.toUpperCase()]; |
} else { |
var stype = dojo.html.selectionType.TEXT; |
var oSel; |
try { |
oSel = dojo.global().getSelection(); |
} |
catch (e) { |
} |
if (oSel && oSel.rangeCount == 1) { |
var oRange = oSel.getRangeAt(0); |
if (oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 && oRange.startContainer.nodeType != dojo.dom.TEXT_NODE) { |
stype = dojo.html.selectionType.CONTROL; |
} |
} |
return stype; |
} |
}, isCollapsed:function () { |
var _window = dojo.global(); |
var _document = dojo.doc(); |
if (_document["selection"]) { |
return _document.selection.createRange().text == ""; |
} else { |
if (_window["getSelection"]) { |
var selection = _window.getSelection(); |
if (dojo.lang.isString(selection)) { |
return selection == ""; |
} else { |
return selection.isCollapsed || selection.toString() == ""; |
} |
} |
} |
}, getSelectedElement:function () { |
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) { |
if (dojo.doc()["selection"]) { |
var range = dojo.doc().selection.createRange(); |
if (range && range.item) { |
return dojo.doc().selection.createRange().item(0); |
} |
} else { |
var selection = dojo.global().getSelection(); |
return selection.anchorNode.childNodes[selection.anchorOffset]; |
} |
} |
}, getParentElement:function () { |
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) { |
var p = dojo.html.selection.getSelectedElement(); |
if (p) { |
return p.parentNode; |
} |
} else { |
if (dojo.doc()["selection"]) { |
return dojo.doc().selection.createRange().parentElement(); |
} else { |
var selection = dojo.global().getSelection(); |
if (selection) { |
var node = selection.anchorNode; |
while (node && node.nodeType != dojo.dom.ELEMENT_NODE) { |
node = node.parentNode; |
} |
return node; |
} |
} |
} |
}, getSelectedText:function () { |
if (dojo.doc()["selection"]) { |
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) { |
return null; |
} |
return dojo.doc().selection.createRange().text; |
} else { |
var selection = dojo.global().getSelection(); |
if (selection) { |
return selection.toString(); |
} |
} |
}, getSelectedHtml:function () { |
if (dojo.doc()["selection"]) { |
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) { |
return null; |
} |
return dojo.doc().selection.createRange().htmlText; |
} else { |
var selection = dojo.global().getSelection(); |
if (selection && selection.rangeCount) { |
var frag = selection.getRangeAt(0).cloneContents(); |
var div = document.createElement("div"); |
div.appendChild(frag); |
return div.innerHTML; |
} |
return null; |
} |
}, hasAncestorElement:function (tagName) { |
return (dojo.html.selection.getAncestorElement.apply(this, arguments) != null); |
}, getAncestorElement:function (tagName) { |
var node = dojo.html.selection.getSelectedElement() || dojo.html.selection.getParentElement(); |
while (node) { |
if (dojo.html.selection.isTag(node, arguments).length > 0) { |
return node; |
} |
node = node.parentNode; |
} |
return null; |
}, isTag:function (node, tags) { |
if (node && node.tagName) { |
for (var i = 0; i < tags.length; i++) { |
if (node.tagName.toLowerCase() == String(tags[i]).toLowerCase()) { |
return String(tags[i]).toLowerCase(); |
} |
} |
} |
return ""; |
}, selectElement:function (element) { |
var _window = dojo.global(); |
var _document = dojo.doc(); |
element = dojo.byId(element); |
if (_document.selection && dojo.body().createTextRange) { |
try { |
var range = dojo.body().createControlRange(); |
range.addElement(element); |
range.select(); |
} |
catch (e) { |
dojo.html.selection.selectElementChildren(element); |
} |
} else { |
if (_window["getSelection"]) { |
var selection = _window.getSelection(); |
if (selection["removeAllRanges"]) { |
var range = _document.createRange(); |
range.selectNode(element); |
selection.removeAllRanges(); |
selection.addRange(range); |
} |
} |
} |
}, selectElementChildren:function (element) { |
var _window = dojo.global(); |
var _document = dojo.doc(); |
element = dojo.byId(element); |
if (_document.selection && dojo.body().createTextRange) { |
var range = dojo.body().createTextRange(); |
range.moveToElementText(element); |
range.select(); |
} else { |
if (_window["getSelection"]) { |
var selection = _window.getSelection(); |
if (selection["setBaseAndExtent"]) { |
selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1); |
} else { |
if (selection["selectAllChildren"]) { |
selection.selectAllChildren(element); |
} |
} |
} |
} |
}, getBookmark:function () { |
var bookmark; |
var _document = dojo.doc(); |
if (_document["selection"]) { |
var range = _document.selection.createRange(); |
bookmark = range.getBookmark(); |
} else { |
var selection; |
try { |
selection = dojo.global().getSelection(); |
} |
catch (e) { |
} |
if (selection) { |
var range = selection.getRangeAt(0); |
bookmark = range.cloneRange(); |
} else { |
dojo.debug("No idea how to store the current selection for this browser!"); |
} |
} |
return bookmark; |
}, moveToBookmark:function (bookmark) { |
var _document = dojo.doc(); |
if (_document["selection"]) { |
var range = _document.selection.createRange(); |
range.moveToBookmark(bookmark); |
range.select(); |
} else { |
var selection; |
try { |
selection = dojo.global().getSelection(); |
} |
catch (e) { |
} |
if (selection && selection["removeAllRanges"]) { |
selection.removeAllRanges(); |
selection.addRange(bookmark); |
} else { |
dojo.debug("No idea how to restore selection for this browser!"); |
} |
} |
}, collapse:function (beginning) { |
if (dojo.global()["getSelection"]) { |
var selection = dojo.global().getSelection(); |
if (selection.removeAllRanges) { |
if (beginning) { |
selection.collapseToStart(); |
} else { |
selection.collapseToEnd(); |
} |
} else { |
dojo.global().getSelection().collapse(beginning); |
} |
} else { |
if (dojo.doc().selection) { |
var range = dojo.doc().selection.createRange(); |
range.collapse(beginning); |
range.select(); |
} |
} |
}, remove:function () { |
if (dojo.doc().selection) { |
var selection = dojo.doc().selection; |
if (selection.type.toUpperCase() != "NONE") { |
selection.clear(); |
} |
return selection; |
} else { |
var selection = dojo.global().getSelection(); |
for (var i = 0; i < selection.rangeCount; i++) { |
selection.getRangeAt(i).deleteContents(); |
} |
return selection; |
} |
}}); |
|