Cleaned up legacy code for IE8

This commit is contained in:
josdejong 2013-11-15 15:42:11 +01:00
parent 35568380f2
commit 65c0c480d2
13 changed files with 102 additions and 431 deletions

View File

@ -3,6 +3,11 @@
http://jsoneditoronline.org http://jsoneditoronline.org
## not yet released, version 2.3.4
- Dropped support for IE8, cleaned up legacy code for old browsers.
## 2013-10-17, version 2.3.3 ## 2013-10-17, version 2.3.3
- Added support for search (Ctrl+F) in the code editor Ace. - Added support for search (Ctrl+F) in the code editor Ace.

View File

@ -158,7 +158,6 @@ app.load = function() {
var domOpen = document.getElementById('open'); var domOpen = document.getElementById('open');
var domOpenMenuButton = document.getElementById('openMenuButton'); var domOpenMenuButton = document.getElementById('openMenuButton');
domOpen.onclick = function (event) { domOpen.onclick = function (event) {
event = event || window.event; // for IE8
var target = event.target || event.srcElement; var target = event.target || event.srcElement;
if (target == domOpenMenuButton || if (target == domOpenMenuButton ||
(event.offsetX > domOpen.offsetWidth - domOpenMenuButton.offsetWidth)) { (event.offsetX > domOpen.offsetWidth - domOpenMenuButton.offsetWidth)) {
@ -174,16 +173,16 @@ app.load = function() {
var domMenuOpenFile = document.getElementById('menuOpenFile'); var domMenuOpenFile = document.getElementById('menuOpenFile');
domMenuOpenFile.onclick = function (event) { domMenuOpenFile.onclick = function (event) {
app.openFile(); app.openFile();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
jsoneditor.util.preventDefault(event); event.preventDefault();
}; };
// menu button open url // menu button open url
var domMenuOpenUrl = document.getElementById('menuOpenUrl'); var domMenuOpenUrl = document.getElementById('menuOpenUrl');
domMenuOpenUrl.onclick = function (event) { domMenuOpenUrl.onclick = function (event) {
app.openUrl(); app.openUrl();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
jsoneditor.util.preventDefault(event); event.preventDefault();
}; };
// save button // save button

View File

@ -399,12 +399,11 @@ FileRetriever.prototype.prompt = function (params) {
}; };
var onKeyDown = jsoneditor.util.addEventListener(document, 'keydown', function (event) { var onKeyDown = jsoneditor.util.addEventListener(document, 'keydown', function (event) {
event = event || window.event; var keynum = event.which;
var keynum = event.which || event.keyCode;
if (keynum == 27) { // ESC if (keynum == 27) { // ESC
onCancel(); onCancel();
jsoneditor.util.preventDefault(event); event.preventDefault();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
} }
}); });
@ -484,8 +483,7 @@ FileRetriever.prototype.prompt = function (params) {
background.className = 'fileretriever-background'; background.className = 'fileretriever-background';
background.appendChild(border); background.appendChild(border);
background.onclick = function (event) { background.onclick = function (event) {
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement;
if (target == background) { if (target == background) {
onCancel(); onCancel();
} }

View File

@ -139,12 +139,11 @@ Notify.prototype.removeMessage = function (message) {
* @private * @private
*/ */
Notify.prototype.onKeyDown = function (event) { Notify.prototype.onKeyDown = function (event) {
event = event || window.event; var keynum = event.which;
var keynum = event.which || event.keyCode;
if (keynum == 27) { // ESC if (keynum == 27) { // ESC
// remove the oldest open and closeable message // remove the oldest open and closeable message
this.removeMessage(); this.removeMessage();
jsoneditor.util.preventDefault(event); event.preventDefault();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
} }
}; };

View File

@ -57,8 +57,8 @@ Splitter.prototype.onMouseDown = function (event) {
this.params.changed = false; this.params.changed = false;
this.params.value = this.getValue(); this.params.value = this.getValue();
} }
jsoneditor.util.preventDefault(event); event.preventDefault();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
}; };
/** /**
@ -81,8 +81,8 @@ Splitter.prototype.onMouseMove = function (event) {
this.onChange(value); this.onChange(value);
} }
jsoneditor.util.preventDefault(event); event.preventDefault();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
}; };
/** /**
@ -113,8 +113,8 @@ Splitter.prototype.onMouseUp = function (event) {
} }
} }
} }
jsoneditor.util.preventDefault(event); event.preventDefault();
jsoneditor.util.stopPropagation(event); event.stopPropagation();
}; };
/** /**

5
jsoneditor-min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -63,11 +63,11 @@ function JSONEditor (container, options, json) {
throw new Error('JSONEditor constructor called without "new".'); throw new Error('JSONEditor constructor called without "new".');
} }
// check availability of JSON parser (not available in IE7 and older) // check for unsupported browser (IE8 and older)
if (typeof JSON === 'undefined') { var ieVersion = util.getInternetExplorerVersion();
throw new Error ('Your browser does not support JSON. \n\n' + if (ieVersion != -1 && ieVersion < 9) {
'Please install the newest version of your browser.\n' + throw new Error('Unsupported browser, IE9 or newer required. ' +
'(all modern browsers support JSON).'); 'Please install the newest version of your browser.');
} }
if (arguments.length) { if (arguments.length) {
@ -733,15 +733,14 @@ TreeEditor.prototype._createFrame = function () {
editor._onEvent(event); editor._onEvent(event);
}; };
this.frame.onclick = function (event) { this.frame.onclick = function (event) {
event = event || window.event; var target = event.target;// || event.srcElement;
var target = event.target || event.srcElement;
onEvent(event); onEvent(event);
// prevent default submit action of buttons when TreeEditor is located // prevent default submit action of buttons when TreeEditor is located
// inside a form // inside a form
if (target.nodeName == 'BUTTON') { if (target.nodeName == 'BUTTON') {
util.preventDefault(event); event.preventDefault();
} }
}; };
this.frame.oninput = onEvent; this.frame.oninput = onEvent;
@ -866,8 +865,7 @@ TreeEditor.prototype._onRedo = function () {
* @private * @private
*/ */
TreeEditor.prototype._onEvent = function (event) { TreeEditor.prototype._onEvent = function (event) {
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement;
if (event.type == 'keydown') { if (event.type == 'keydown') {
this._onKeyDown(event); this._onKeyDown(event);
@ -895,8 +893,6 @@ TreeEditor.prototype._onKeyDown = function (event) {
var handled = false; var handled = false;
if (keynum == 9) { // Tab or Shift+Tab if (keynum == 9) { // Tab or Shift+Tab
// FIXME: selecting all text on tab key does not work on IE8 (-> put selectContentEditable() in keyup too?)
//Node.select(TreeEditor.domFocus);
setTimeout(function () { setTimeout(function () {
// select all text when moving focus to an editable div // select all text when moving focus to an editable div
util.selectContentEditable(TreeEditor.domFocus); util.selectContentEditable(TreeEditor.domFocus);
@ -938,8 +934,8 @@ TreeEditor.prototype._onKeyDown = function (event) {
} }
if (handled) { if (handled) {
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };
@ -960,13 +956,6 @@ TreeEditor.prototype._createTable = function () {
this.table.className = 'tree'; this.table.className = 'tree';
this.content.appendChild(this.table); this.content.appendChild(this.table);
// IE8 does not handle overflow='auto' correctly.
// Therefore, set overflow to 'scroll'
var ieVersion = util.getInternetExplorerVersion();
if (ieVersion == 8) {
this.content.style.overflow = 'scroll';
}
// create colgroup where the first two columns don't have a fixed // create colgroup where the first two columns don't have a fixed
// width, and the edit columns do have a fixed width // width, and the edit columns do have a fixed width
var col; var col;
@ -1060,11 +1049,6 @@ TextEditor.prototype._create = function (container, options, json) {
util.log('WARNING: Cannot load code editor, Ace library not loaded. ' + util.log('WARNING: Cannot load code editor, Ace library not loaded. ' +
'Falling back to plain text editor'); 'Falling back to plain text editor');
} }
if (util.getInternetExplorerVersion() == 8) {
this.mode = 'text';
util.log('WARNING: Cannot load code editor, Ace is not supported on IE8. ' +
'Falling back to plain text editor');
}
} }
var me = this; var me = this;
@ -1080,7 +1064,7 @@ TextEditor.prototype._create = function (container, options, json) {
this.frame.className = 'jsoneditor'; this.frame.className = 'jsoneditor';
this.frame.onclick = function (event) { this.frame.onclick = function (event) {
// prevent default submit action when TextEditor is located inside a form // prevent default submit action when TextEditor is located inside a form
util.preventDefault(event); event.preventDefault();
}; };
// create menu // create menu
@ -2513,8 +2497,6 @@ Node.prototype.getDom = function() {
* @private * @private
*/ */
Node.prototype._onDragStart = function (event) { Node.prototype._onDragStart = function (event) {
event = event || window.event;
var node = this; var node = this;
if (!this.mousemove) { if (!this.mousemove) {
this.mousemove = util.addEventListener(document, 'mousemove', this.mousemove = util.addEventListener(document, 'mousemove',
@ -2535,12 +2517,12 @@ Node.prototype._onDragStart = function (event) {
'oldCursor': document.body.style.cursor, 'oldCursor': document.body.style.cursor,
'startParent': this.parent, 'startParent': this.parent,
'startIndex': this.parent.childs.indexOf(this), 'startIndex': this.parent.childs.indexOf(this),
'mouseX': util.getMouseX(event), 'mouseX': event.pageX,
'level': this.getLevel() 'level': this.getLevel()
}; };
document.body.style.cursor = 'move'; document.body.style.cursor = 'move';
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -2550,9 +2532,8 @@ Node.prototype._onDragStart = function (event) {
*/ */
Node.prototype._onDrag = function (event) { Node.prototype._onDrag = function (event) {
// TODO: this method has grown too large. Split it in a number of methods // TODO: this method has grown too large. Split it in a number of methods
event = event || window.event; var mouseY = event.pageY;
var mouseY = util.getMouseY(event); var mouseX = event.pageX;
var mouseX = util.getMouseX(event);
var trThis, trPrev, trNext, trFirst, trLast, trRoot; var trThis, trPrev, trNext, trFirst, trLast, trRoot;
var nodePrev, nodeNext; var nodePrev, nodeNext;
@ -2683,7 +2664,7 @@ Node.prototype._onDrag = function (event) {
// auto scroll when hovering around the top of the editor // auto scroll when hovering around the top of the editor
this.editor.startAutoScroll(mouseY); this.editor.startAutoScroll(mouseY);
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -2692,8 +2673,6 @@ Node.prototype._onDrag = function (event) {
* @private * @private
*/ */
Node.prototype._onDragEnd = function (event) { Node.prototype._onDragEnd = function (event) {
event = event || window.event;
var params = { var params = {
'node': this, 'node': this,
'startParent': this.drag.startParent, 'startParent': this.drag.startParent,
@ -2722,7 +2701,7 @@ Node.prototype._onDragEnd = function (event) {
// Stop any running auto scroll // Stop any running auto scroll
this.editor.stopAutoScroll(); this.editor.stopAutoScroll();
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -3176,7 +3155,7 @@ Node.prototype.onEvent = function (event) {
case 'click': case 'click':
var left = (event.offsetX != undefined) ? var left = (event.offsetX != undefined) ?
(event.offsetX < (this.getLevel() + 1) * 24) : (event.offsetX < (this.getLevel() + 1) * 24) :
(util.getMouseX(event) < util.getAbsoluteLeft(dom.tdSeparator));// for FF (event.pageX < util.getAbsoluteLeft(dom.tdSeparator));// for FF
if (left || expandable) { if (left || expandable) {
// node is expandable when it is an object or array // node is expandable when it is an object or array
if (domField) { if (domField) {
@ -3405,8 +3384,8 @@ Node.prototype.onKeyDown = function (event) {
} }
if (handled) { if (handled) {
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };
@ -4581,7 +4560,7 @@ ContextMenu.prototype.show = function (anchor) {
this.hide(); this.hide();
// calculate whether the menu fits below the anchor // calculate whether the menu fits below the anchor
var windowHeight = util.getWindowHeight(); var windowHeight = window.innerHeight;
var anchorHeight = anchor.offsetHeight; var anchorHeight = anchor.offsetHeight;
var menuHeight = this.maxHeight; var menuHeight = this.maxHeight;
@ -4610,19 +4589,18 @@ ContextMenu.prototype.show = function (anchor) {
this.eventListeners.mousedown = util.addEventListener( this.eventListeners.mousedown = util.addEventListener(
document, 'mousedown', function (event) { document, 'mousedown', function (event) {
// hide menu on click outside of the menu // hide menu on click outside of the menu
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement;
if ((target != list) && !me._isChildOf(target, list)) { if ((target != list) && !me._isChildOf(target, list)) {
me.hide(); me.hide();
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
} }
}); });
this.eventListeners.mousewheel = util.addEventListener( this.eventListeners.mousewheel = util.addEventListener(
document, 'mousewheel', function () { document, 'mousewheel', function () {
// hide the menu on mouse scroll // hide the menu on mouse scroll
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
}); });
this.eventListeners.keydown = util.addEventListener( this.eventListeners.keydown = util.addEventListener(
document, 'keydown', function (event) { document, 'keydown', function (event) {
@ -4717,9 +4695,8 @@ ContextMenu.prototype._onExpandItem = function (domItem) {
* @private * @private
*/ */
ContextMenu.prototype._onKeyDown = function (event) { ContextMenu.prototype._onKeyDown = function (event) {
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement; var keynum = event.which;
var keynum = event.which || event.keyCode;
var handled = false; var handled = false;
var buttons, targetIndex, prevButton, nextButton; var buttons, targetIndex, prevButton, nextButton;
@ -4816,8 +4793,8 @@ ContextMenu.prototype._onKeyDown = function (event) {
// TODO: arrow left and right // TODO: arrow left and right
if (handled) { if (handled) {
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
} }
}; };
@ -5216,7 +5193,7 @@ function SearchBox (editor, container) {
search.oninput = function (event) { search.oninput = function (event) {
searchBox._onDelayedSearch(event); searchBox._onDelayedSearch(event);
}; };
search.onchange = function (event) { // For IE 8 search.onchange = function (event) { // For IE 9
searchBox._onSearch(event); searchBox._onSearch(event);
}; };
search.onkeydown = function (event) { search.onkeydown = function (event) {
@ -5404,13 +5381,12 @@ SearchBox.prototype._onSearch = function (event, forceSearch) {
* @private * @private
*/ */
SearchBox.prototype._onKeyDown = function (event) { SearchBox.prototype._onKeyDown = function (event) {
event = event || window.event; var keynum = event.which;
var keynum = event.which || event.keyCode;
if (keynum == 27) { // ESC if (keynum == 27) { // ESC
this.dom.search.value = ''; // clear search this.dom.search.value = ''; // clear search
this._onSearch(event); this._onSearch(event);
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
else if (keynum == 13) { // Enter else if (keynum == 13) { // Enter
if (event.ctrlKey) { if (event.ctrlKey) {
@ -5425,8 +5401,8 @@ SearchBox.prototype._onKeyDown = function (event) {
// move to the next search result // move to the next search result
this.next(); this.next();
} }
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };
@ -5436,10 +5412,9 @@ SearchBox.prototype._onKeyDown = function (event) {
* @private * @private
*/ */
SearchBox.prototype._onKeyUp = function (event) { SearchBox.prototype._onKeyUp = function (event) {
event = event || window.event; var keynum = event.keyCode;
var keynum = event.which || event.keyCode;
if (keynum != 27 && keynum != 13) { // !show and !Enter if (keynum != 27 && keynum != 13) { // !show and !Enter
this._onDelayedSearch(event); // For IE 8 this._onDelayedSearch(event); // For IE 9
} }
}; };
@ -5529,34 +5504,6 @@ Highlighter.prototype.unlock = function () {
// create namespace // create namespace
util = {}; util = {};
// http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj){
for(var i = 0; i < this.length; i++){
if(this[i] == obj){
return i;
}
}
return -1;
}
}
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(fn, scope) {
for(var i = 0, len = this.length; i < len; ++i) {
fn.call(scope || this, this[i], i, this);
}
}
}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
if(!Array.isArray) {
Array.isArray = function (vArg) {
return Object.prototype.toString.call(vArg) === "[object Array]";
};
}
/** /**
* Parse JSON using the parser built-in in the browser. * Parse JSON using the parser built-in in the browser.
* On exception, the jsonString is validated and a detailed error is thrown. * On exception, the jsonString is validated and a detailed error is thrown.
@ -5623,7 +5570,7 @@ util.clear = function clear (a) {
* @param {...*} args * @param {...*} args
*/ */
util.log = function log (args) { util.log = function log (args) {
if (console && typeof console.log === 'function') { if (typeof console !== 'undefined' && typeof console.log === 'function') {
console.log.apply(console, arguments); console.log.apply(console, arguments);
} }
}; };
@ -5706,57 +5653,6 @@ util.getAbsoluteTop = function getAbsoluteTop(elem) {
return top; return top;
}; };
/**
* Get the absolute, vertical mouse position from an event.
* @param {Event} event
* @return {Number} mouseY
*/
util.getMouseY = function getMouseY(event) {
var mouseY;
if ('pageY' in event) {
mouseY = event.pageY;
}
else {
// for IE8 and older
mouseY = (event.clientY + document.documentElement.scrollTop);
}
return mouseY;
};
/**
* Get the absolute, horizontal mouse position from an event.
* @param {Event} event
* @return {Number} mouseX
*/
util.getMouseX = function getMouseX(event) {
var mouseX;
if ('pageX' in event) {
mouseX = event.pageX;
}
else {
// for IE8 and older
mouseX = (event.clientX + document.documentElement.scrollLeft);
}
return mouseX;
};
/**
* Get the window height
* @return {Number} windowHeight
*/
util.getWindowHeight = function getWindowHeight() {
if ('innerHeight' in window) {
return window.innerHeight;
}
else {
// for IE8 and older
return Math.max(document.body.clientHeight,
document.documentElement.clientHeight);
}
};
/** /**
* add a className to the given elements style * add a className to the given elements style
* @param {Element} elem * @param {Element} elem
@ -5825,7 +5721,7 @@ util.stripFormatting = function stripFormatting(divElement) {
*/ */
util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) { util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) {
var range, selection; var range, selection;
if(document.createRange) {//Firefox, Chrome, Opera, Safari, IE 9+ if(document.createRange) {
range = document.createRange();//Create a range (a range is a like the selection but invisible) range = document.createRange();//Create a range (a range is a like the selection but invisible)
range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range
range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
@ -5833,12 +5729,6 @@ util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableE
selection.removeAllRanges();//remove any selections already made selection.removeAllRanges();//remove any selections already made
selection.addRange(range);//make the range you have just created the visible selection selection.addRange(range);//make the range you have just created the visible selection
} }
else if(document.selection) {//IE 8 and lower
range = document.body.createTextRange();//Create a range (a range is a like the selection but invisible)
range.moveToElementText(contentEditableElement);//Select the entire contents of the element with the range
range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
range.select();//Select the range (make it the visible selection
}
}; };
/** /**
@ -5858,10 +5748,6 @@ util.selectContentEditable = function selectContentEditable(contentEditableEleme
sel = window.getSelection(); sel = window.getSelection();
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
} else if (document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(contentEditableElement);
range.select();
} }
}; };
@ -5876,8 +5762,6 @@ util.getSelection = function getSelection() {
if (sel.getRangeAt && sel.rangeCount) { if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0); return sel.getRangeAt(0);
} }
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
} }
return null; return null;
}; };
@ -5893,8 +5777,6 @@ util.setSelection = function setSelection(range) {
var sel = window.getSelection(); var sel = window.getSelection();
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
} }
} }
}; };
@ -5919,9 +5801,6 @@ util.getSelectionOffset = function getSelectionOffset() {
container: range.startContainer.parentNode container: range.startContainer.parentNode
}; };
} }
else {
// TODO: implement getSelectionOffset for IE8
}
return null; return null;
}; };
@ -5946,9 +5825,6 @@ util.setSelectionOffset = function setSelectionOffset(params) {
util.setSelection(range); util.setSelection(range);
} }
} }
else {
// TODO: implement setSelectionOffset for IE8
}
}; };
/** /**
@ -6074,12 +5950,7 @@ util.addEventListener = function addEventListener(element, action, listener, use
element.addEventListener(action, listener, useCapture); element.addEventListener(action, listener, useCapture);
return listener; return listener;
} else { } else {
// IE browsers throw new Error('missing function addEventListener');
var f = function () {
return listener.call(element, window.event);
};
element.attachEvent("on" + action, f);
return f;
} }
}; };
@ -6092,7 +5963,6 @@ util.addEventListener = function addEventListener(element, action, listener, use
*/ */
util.removeEventListener = function removeEventListener(element, action, listener, useCapture) { util.removeEventListener = function removeEventListener(element, action, listener, useCapture) {
if (element.removeEventListener) { if (element.removeEventListener) {
// non-IE browsers
if (useCapture === undefined) if (useCapture === undefined)
useCapture = false; useCapture = false;
@ -6102,44 +5972,7 @@ util.removeEventListener = function removeEventListener(element, action, listene
element.removeEventListener(action, listener, useCapture); element.removeEventListener(action, listener, useCapture);
} else { } else {
// IE browsers throw new Error('missing function removeEventListener');
element.detachEvent("on" + action, listener);
}
};
/**
* Stop event propagation
* @param {Event} event
*/
util.stopPropagation = function stopPropagation(event) {
if (!event) {
event = window.event;
}
if (event.stopPropagation) {
event.stopPropagation(); // non-IE browsers
}
else {
event.cancelBubble = true; // IE browsers
}
};
/**
* Cancels the event if it is cancelable, without stopping further propagation of the event.
* @param {Event} event
*/
util.preventDefault = function preventDefault(event) {
if (!event) {
event = window.event;
}
if (event.preventDefault) {
event.preventDefault(); // non-IE browsers
}
else {
event.returnValue = false; // IE browsers
} }
}; };

View File

@ -180,7 +180,7 @@ ContextMenu.prototype.show = function (anchor) {
this.hide(); this.hide();
// calculate whether the menu fits below the anchor // calculate whether the menu fits below the anchor
var windowHeight = util.getWindowHeight(); var windowHeight = window.innerHeight;
var anchorHeight = anchor.offsetHeight; var anchorHeight = anchor.offsetHeight;
var menuHeight = this.maxHeight; var menuHeight = this.maxHeight;
@ -209,19 +209,18 @@ ContextMenu.prototype.show = function (anchor) {
this.eventListeners.mousedown = util.addEventListener( this.eventListeners.mousedown = util.addEventListener(
document, 'mousedown', function (event) { document, 'mousedown', function (event) {
// hide menu on click outside of the menu // hide menu on click outside of the menu
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement;
if ((target != list) && !me._isChildOf(target, list)) { if ((target != list) && !me._isChildOf(target, list)) {
me.hide(); me.hide();
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
} }
}); });
this.eventListeners.mousewheel = util.addEventListener( this.eventListeners.mousewheel = util.addEventListener(
document, 'mousewheel', function () { document, 'mousewheel', function () {
// hide the menu on mouse scroll // hide the menu on mouse scroll
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
}); });
this.eventListeners.keydown = util.addEventListener( this.eventListeners.keydown = util.addEventListener(
document, 'keydown', function (event) { document, 'keydown', function (event) {
@ -316,9 +315,8 @@ ContextMenu.prototype._onExpandItem = function (domItem) {
* @private * @private
*/ */
ContextMenu.prototype._onKeyDown = function (event) { ContextMenu.prototype._onKeyDown = function (event) {
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement; var keynum = event.which;
var keynum = event.which || event.keyCode;
var handled = false; var handled = false;
var buttons, targetIndex, prevButton, nextButton; var buttons, targetIndex, prevButton, nextButton;
@ -415,8 +413,8 @@ ContextMenu.prototype._onKeyDown = function (event) {
// TODO: arrow left and right // TODO: arrow left and right
if (handled) { if (handled) {
util.stopPropagation(event); event.stopPropagation();
util.preventDefault(event); event.preventDefault();
} }
}; };

View File

@ -1189,8 +1189,6 @@ Node.prototype.getDom = function() {
* @private * @private
*/ */
Node.prototype._onDragStart = function (event) { Node.prototype._onDragStart = function (event) {
event = event || window.event;
var node = this; var node = this;
if (!this.mousemove) { if (!this.mousemove) {
this.mousemove = util.addEventListener(document, 'mousemove', this.mousemove = util.addEventListener(document, 'mousemove',
@ -1211,12 +1209,12 @@ Node.prototype._onDragStart = function (event) {
'oldCursor': document.body.style.cursor, 'oldCursor': document.body.style.cursor,
'startParent': this.parent, 'startParent': this.parent,
'startIndex': this.parent.childs.indexOf(this), 'startIndex': this.parent.childs.indexOf(this),
'mouseX': util.getMouseX(event), 'mouseX': event.pageX,
'level': this.getLevel() 'level': this.getLevel()
}; };
document.body.style.cursor = 'move'; document.body.style.cursor = 'move';
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -1226,9 +1224,8 @@ Node.prototype._onDragStart = function (event) {
*/ */
Node.prototype._onDrag = function (event) { Node.prototype._onDrag = function (event) {
// TODO: this method has grown too large. Split it in a number of methods // TODO: this method has grown too large. Split it in a number of methods
event = event || window.event; var mouseY = event.pageY;
var mouseY = util.getMouseY(event); var mouseX = event.pageX;
var mouseX = util.getMouseX(event);
var trThis, trPrev, trNext, trFirst, trLast, trRoot; var trThis, trPrev, trNext, trFirst, trLast, trRoot;
var nodePrev, nodeNext; var nodePrev, nodeNext;
@ -1359,7 +1356,7 @@ Node.prototype._onDrag = function (event) {
// auto scroll when hovering around the top of the editor // auto scroll when hovering around the top of the editor
this.editor.startAutoScroll(mouseY); this.editor.startAutoScroll(mouseY);
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -1368,8 +1365,6 @@ Node.prototype._onDrag = function (event) {
* @private * @private
*/ */
Node.prototype._onDragEnd = function (event) { Node.prototype._onDragEnd = function (event) {
event = event || window.event;
var params = { var params = {
'node': this, 'node': this,
'startParent': this.drag.startParent, 'startParent': this.drag.startParent,
@ -1398,7 +1393,7 @@ Node.prototype._onDragEnd = function (event) {
// Stop any running auto scroll // Stop any running auto scroll
this.editor.stopAutoScroll(); this.editor.stopAutoScroll();
util.preventDefault(event); event.preventDefault();
}; };
/** /**
@ -1852,7 +1847,7 @@ Node.prototype.onEvent = function (event) {
case 'click': case 'click':
var left = (event.offsetX != undefined) ? var left = (event.offsetX != undefined) ?
(event.offsetX < (this.getLevel() + 1) * 24) : (event.offsetX < (this.getLevel() + 1) * 24) :
(util.getMouseX(event) < util.getAbsoluteLeft(dom.tdSeparator));// for FF (event.pageX < util.getAbsoluteLeft(dom.tdSeparator));// for FF
if (left || expandable) { if (left || expandable) {
// node is expandable when it is an object or array // node is expandable when it is an object or array
if (domField) { if (domField) {
@ -2081,8 +2076,8 @@ Node.prototype.onKeyDown = function (event) {
} }
if (handled) { if (handled) {
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };

View File

@ -60,7 +60,7 @@ function SearchBox (editor, container) {
search.oninput = function (event) { search.oninput = function (event) {
searchBox._onDelayedSearch(event); searchBox._onDelayedSearch(event);
}; };
search.onchange = function (event) { // For IE 8 search.onchange = function (event) { // For IE 9
searchBox._onSearch(event); searchBox._onSearch(event);
}; };
search.onkeydown = function (event) { search.onkeydown = function (event) {
@ -248,13 +248,12 @@ SearchBox.prototype._onSearch = function (event, forceSearch) {
* @private * @private
*/ */
SearchBox.prototype._onKeyDown = function (event) { SearchBox.prototype._onKeyDown = function (event) {
event = event || window.event; var keynum = event.which;
var keynum = event.which || event.keyCode;
if (keynum == 27) { // ESC if (keynum == 27) { // ESC
this.dom.search.value = ''; // clear search this.dom.search.value = ''; // clear search
this._onSearch(event); this._onSearch(event);
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
else if (keynum == 13) { // Enter else if (keynum == 13) { // Enter
if (event.ctrlKey) { if (event.ctrlKey) {
@ -269,8 +268,8 @@ SearchBox.prototype._onKeyDown = function (event) {
// move to the next search result // move to the next search result
this.next(); this.next();
} }
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };
@ -280,9 +279,8 @@ SearchBox.prototype._onKeyDown = function (event) {
* @private * @private
*/ */
SearchBox.prototype._onKeyUp = function (event) { SearchBox.prototype._onKeyUp = function (event) {
event = event || window.event; var keynum = event.keyCode;
var keynum = event.which || event.keyCode;
if (keynum != 27 && keynum != 13) { // !show and !Enter if (keynum != 27 && keynum != 13) { // !show and !Enter
this._onDelayedSearch(event); // For IE 8 this._onDelayedSearch(event); // For IE 9
} }
}; };

View File

@ -61,7 +61,7 @@ TextEditor.prototype._create = function (container, options, json) {
this.frame.className = 'jsoneditor'; this.frame.className = 'jsoneditor';
this.frame.onclick = function (event) { this.frame.onclick = function (event) {
// prevent default submit action when TextEditor is located inside a form // prevent default submit action when TextEditor is located inside a form
util.preventDefault(event); event.preventDefault();
}; };
// create menu // create menu

View File

@ -485,15 +485,14 @@ TreeEditor.prototype._createFrame = function () {
editor._onEvent(event); editor._onEvent(event);
}; };
this.frame.onclick = function (event) { this.frame.onclick = function (event) {
event = event || window.event; var target = event.target;// || event.srcElement;
var target = event.target || event.srcElement;
onEvent(event); onEvent(event);
// prevent default submit action of buttons when TreeEditor is located // prevent default submit action of buttons when TreeEditor is located
// inside a form // inside a form
if (target.nodeName == 'BUTTON') { if (target.nodeName == 'BUTTON') {
util.preventDefault(event); event.preventDefault();
} }
}; };
this.frame.oninput = onEvent; this.frame.oninput = onEvent;
@ -618,8 +617,7 @@ TreeEditor.prototype._onRedo = function () {
* @private * @private
*/ */
TreeEditor.prototype._onEvent = function (event) { TreeEditor.prototype._onEvent = function (event) {
event = event || window.event; var target = event.target;
var target = event.target || event.srcElement;
if (event.type == 'keydown') { if (event.type == 'keydown') {
this._onKeyDown(event); this._onKeyDown(event);
@ -647,8 +645,6 @@ TreeEditor.prototype._onKeyDown = function (event) {
var handled = false; var handled = false;
if (keynum == 9) { // Tab or Shift+Tab if (keynum == 9) { // Tab or Shift+Tab
// FIXME: selecting all text on tab key does not work on IE8 (-> put selectContentEditable() in keyup too?)
//Node.select(TreeEditor.domFocus);
setTimeout(function () { setTimeout(function () {
// select all text when moving focus to an editable div // select all text when moving focus to an editable div
util.selectContentEditable(TreeEditor.domFocus); util.selectContentEditable(TreeEditor.domFocus);
@ -690,8 +686,8 @@ TreeEditor.prototype._onKeyDown = function (event) {
} }
if (handled) { if (handled) {
util.preventDefault(event); event.preventDefault();
util.stopPropagation(event); event.stopPropagation();
} }
}; };
@ -712,13 +708,6 @@ TreeEditor.prototype._createTable = function () {
this.table.className = 'tree'; this.table.className = 'tree';
this.content.appendChild(this.table); this.content.appendChild(this.table);
// IE8 does not handle overflow='auto' correctly.
// Therefore, set overflow to 'scroll'
var ieVersion = util.getInternetExplorerVersion();
if (ieVersion == 8) {
this.content.style.overflow = 'scroll';
}
// create colgroup where the first two columns don't have a fixed // create colgroup where the first two columns don't have a fixed
// width, and the edit columns do have a fixed width // width, and the edit columns do have a fixed width
var col; var col;

View File

@ -1,34 +1,6 @@
// create namespace // create namespace
util = {}; util = {};
// http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj){
for(var i = 0; i < this.length; i++){
if(this[i] == obj){
return i;
}
}
return -1;
}
}
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(fn, scope) {
for(var i = 0, len = this.length; i < len; ++i) {
fn.call(scope || this, this[i], i, this);
}
}
}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
if(!Array.isArray) {
Array.isArray = function (vArg) {
return Object.prototype.toString.call(vArg) === "[object Array]";
};
}
/** /**
* Parse JSON using the parser built-in in the browser. * Parse JSON using the parser built-in in the browser.
* On exception, the jsonString is validated and a detailed error is thrown. * On exception, the jsonString is validated and a detailed error is thrown.
@ -178,57 +150,6 @@ util.getAbsoluteTop = function getAbsoluteTop(elem) {
return top; return top;
}; };
/**
* Get the absolute, vertical mouse position from an event.
* @param {Event} event
* @return {Number} mouseY
*/
util.getMouseY = function getMouseY(event) {
var mouseY;
if ('pageY' in event) {
mouseY = event.pageY;
}
else {
// for IE8 and older
mouseY = (event.clientY + document.documentElement.scrollTop);
}
return mouseY;
};
/**
* Get the absolute, horizontal mouse position from an event.
* @param {Event} event
* @return {Number} mouseX
*/
util.getMouseX = function getMouseX(event) {
var mouseX;
if ('pageX' in event) {
mouseX = event.pageX;
}
else {
// for IE8 and older
mouseX = (event.clientX + document.documentElement.scrollLeft);
}
return mouseX;
};
/**
* Get the window height
* @return {Number} windowHeight
*/
util.getWindowHeight = function getWindowHeight() {
if ('innerHeight' in window) {
return window.innerHeight;
}
else {
// for IE8 and older
return Math.max(document.body.clientHeight,
document.documentElement.clientHeight);
}
};
/** /**
* add a className to the given elements style * add a className to the given elements style
* @param {Element} elem * @param {Element} elem
@ -297,7 +218,7 @@ util.stripFormatting = function stripFormatting(divElement) {
*/ */
util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) { util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) {
var range, selection; var range, selection;
if(document.createRange) {//Firefox, Chrome, Opera, Safari, IE 9+ if(document.createRange) {
range = document.createRange();//Create a range (a range is a like the selection but invisible) range = document.createRange();//Create a range (a range is a like the selection but invisible)
range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range
range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
@ -305,12 +226,6 @@ util.setEndOfContentEditable = function setEndOfContentEditable(contentEditableE
selection.removeAllRanges();//remove any selections already made selection.removeAllRanges();//remove any selections already made
selection.addRange(range);//make the range you have just created the visible selection selection.addRange(range);//make the range you have just created the visible selection
} }
else if(document.selection) {//IE 8 and lower
range = document.body.createTextRange();//Create a range (a range is a like the selection but invisible)
range.moveToElementText(contentEditableElement);//Select the entire contents of the element with the range
range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
range.select();//Select the range (make it the visible selection
}
}; };
/** /**
@ -330,10 +245,6 @@ util.selectContentEditable = function selectContentEditable(contentEditableEleme
sel = window.getSelection(); sel = window.getSelection();
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
} else if (document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(contentEditableElement);
range.select();
} }
}; };
@ -348,8 +259,6 @@ util.getSelection = function getSelection() {
if (sel.getRangeAt && sel.rangeCount) { if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0); return sel.getRangeAt(0);
} }
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
} }
return null; return null;
}; };
@ -365,8 +274,6 @@ util.setSelection = function setSelection(range) {
var sel = window.getSelection(); var sel = window.getSelection();
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
} }
} }
}; };
@ -391,9 +298,6 @@ util.getSelectionOffset = function getSelectionOffset() {
container: range.startContainer.parentNode container: range.startContainer.parentNode
}; };
} }
else {
// TODO: implement getSelectionOffset for IE8
}
return null; return null;
}; };
@ -418,9 +322,6 @@ util.setSelectionOffset = function setSelectionOffset(params) {
util.setSelection(range); util.setSelection(range);
} }
} }
else {
// TODO: implement setSelectionOffset for IE8
}
}; };
/** /**
@ -546,12 +447,7 @@ util.addEventListener = function addEventListener(element, action, listener, use
element.addEventListener(action, listener, useCapture); element.addEventListener(action, listener, useCapture);
return listener; return listener;
} else { } else {
// IE browsers throw new Error('missing function addEventListener');
var f = function () {
return listener.call(element, window.event);
};
element.attachEvent("on" + action, f);
return f;
} }
}; };
@ -564,7 +460,6 @@ util.addEventListener = function addEventListener(element, action, listener, use
*/ */
util.removeEventListener = function removeEventListener(element, action, listener, useCapture) { util.removeEventListener = function removeEventListener(element, action, listener, useCapture) {
if (element.removeEventListener) { if (element.removeEventListener) {
// non-IE browsers
if (useCapture === undefined) if (useCapture === undefined)
useCapture = false; useCapture = false;
@ -574,43 +469,6 @@ util.removeEventListener = function removeEventListener(element, action, listene
element.removeEventListener(action, listener, useCapture); element.removeEventListener(action, listener, useCapture);
} else { } else {
// IE browsers throw new Error('missing function removeEventListener');
element.detachEvent("on" + action, listener);
}
};
/**
* Stop event propagation
* @param {Event} event
*/
util.stopPropagation = function stopPropagation(event) {
if (!event) {
event = window.event;
}
if (event.stopPropagation) {
event.stopPropagation(); // non-IE browsers
}
else {
event.cancelBubble = true; // IE browsers
}
};
/**
* Cancels the event if it is cancelable, without stopping further propagation of the event.
* @param {Event} event
*/
util.preventDefault = function preventDefault(event) {
if (!event) {
event = window.event;
}
if (event.preventDefault) {
event.preventDefault(); // non-IE browsers
}
else {
event.returnValue = false; // IE browsers
} }
}; };