X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-utils.js;h=bf488efd02eb59467a13ee0399fd0473bc0d5220;hb=41ee764f8a4eca14b72c66116b6cca0084b82b77;hp=7cb50198ebab6c8540560625956e796f592a734b;hpb=48e614acf3084b9836803f8b014bf0e65f1ca119;p=dygraphs.git diff --git a/dygraph-utils.js b/dygraph-utils.js index 7cb5019..bf488ef 100644 --- a/dygraph-utils.js +++ b/dygraph-utils.js @@ -1,5 +1,8 @@ -// Copyright 2011 Dan Vanderkam (danvdk@gmail.com) -// All Rights Reserved. +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ /** * @fileoverview This file contains utility functions used by dygraphs. These @@ -90,20 +93,35 @@ Dygraph.getContext = function(canvas) { * @private * Add an event handler. This smooths a difference between IE and the rest of * the world. - * @param { DOM element } el The element to add the event to. - * @param { String } evt The name of the event, e.g. 'click' or 'mousemove'. + * @param { DOM element } elem The element to add the event to. + * @param { String } type The type of the event, e.g. 'click' or 'mousemove'. * @param { Function } fn The function to call on the event. The function takes * one parameter: the event object. */ -Dygraph.addEvent = function(el, evt, fn) { - var normed_fn = function(e) { - if (!e) var e = window.event; - fn(e); - }; - if (window.addEventListener) { // Mozilla, Netscape, Firefox - el.addEventListener(evt, normed_fn, false); - } else { // IE - el.attachEvent('on' + evt, normed_fn); +Dygraph.addEvent = function addEvent(elem, type, fn) { + if (elem.addEventListener) { + elem.addEventListener(type, fn, false); + } else { + elem[type+fn] = function(){fn(window.event);}; + elem.attachEvent('on'+type, elem[type+fn]); + } +}; + +/** + * @private + * Remove an event handler. This smooths a difference between IE and the rest of + * the world. + * @param { DOM element } elem The element to add the event to. + * @param { String } type The type of the event, e.g. 'click' or 'mousemove'. + * @param { Function } fn The function to call on the event. The function takes + * one parameter: the event object. + */ +Dygraph.removeEvent = function addEvent(elem, type, fn) { + if (elem.removeEventListener) { + elem.removeEventListener(type, fn, false); + } else { + elem.detachEvent('on'+type, elem[type+fn]); + elem[type+fn] = null; } }; @@ -476,6 +494,14 @@ Dygraph.update = function (self, o) { * @private */ Dygraph.updateDeep = function (self, o) { + // Taken from http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object + function isNode(o) { + return ( + typeof Node === "object" ? o instanceof Node : + typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string" + ); + } + if (typeof(o) != 'undefined' && o !== null) { for (var k in o) { if (o.hasOwnProperty(k)) { @@ -483,6 +509,9 @@ Dygraph.updateDeep = function (self, o) { self[k] = null; } else if (Dygraph.isArrayLike(o[k])) { self[k] = o[k].slice(); + } else if (isNode(o[k])) { + // DOM objects are shallowly-copied. + self[k] = o[k]; } else if (typeof(o[k]) == 'object') { if (typeof(self[k]) != 'object') { self[k] = {}; @@ -606,6 +635,8 @@ Dygraph.isPixelChangingOptionList = function(labels, attrs) { 'pixelsPerYLabel': true, 'pointClickCallback': true, 'pointSize': true, + 'rangeSelectorPlotFillColor': true, + 'rangeSelectorPlotStrokeColor': true, 'showLabelsOnHighlight': true, 'showRoller': true, 'sigFigs': true, @@ -618,7 +649,7 @@ Dygraph.isPixelChangingOptionList = function(labels, attrs) { 'yAxisLabelFormatter': true, 'yValueFormatter': true, 'zoomCallback': true - }; + }; // Assume that we do not require new points. // This will change to true if we actually do need new points. @@ -656,7 +687,7 @@ Dygraph.isPixelChangingOptionList = function(labels, attrs) { // If this was not a series specific option list, check if its a pixel changing property. } else if (!pixelSafeOptions[property]) { requiresNewPoints = true; - } + } } }