fit-ui 2.20.0 → 2.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Fit.UI.js CHANGED
@@ -682,7 +682,7 @@ Fit._internal =
682
682
  {
683
683
  Core:
684
684
  {
685
- VersionInfo: { Major: 2, Minor: 20, Patch: 0 } // Do NOT modify format - version numbers are programmatically changed when releasing new versions - MUST be on a separate line!
685
+ VersionInfo: { Major: 2, Minor: 20, Patch: 2 } // Do NOT modify format - version numbers are programmatically changed when releasing new versions - MUST be on a separate line!
686
686
  }
687
687
  };
688
688
 
@@ -7720,351 +7720,6 @@ Fit.DragDrop.DropZone._internal =
7720
7720
  active: null
7721
7721
  }
7722
7722
 
7723
- /// <container name="Fit.EventManager">
7724
- /// </container>
7725
-
7726
- /// <function container="Fit.EventManager" name="EventManager" access="public">
7727
- /// <description> Create instance of EventManager </description>
7728
- /// </function>
7729
- Fit.EventManager = function()
7730
- {
7731
- var registrations = []; // { Dom: DOMElement, Event: string, Handler: function, Options?: { Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean } }[]
7732
-
7733
-
7734
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7735
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7736
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7737
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7738
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7739
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7740
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7741
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7742
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7743
- // TODO: Create "proxies" for function such as PreventDefault, StopProgation, etc. so we don't need to use both Fit.EventManager and Fit.Events ??
7744
-
7745
-
7746
- /// <function container="Fit.EventManager" name="Add" access="public">
7747
- /// <description> Registers event handler for specified event on given EventTarget </description>
7748
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7749
- /// <param name="event" type='"keydown" | "keyup" | "keypress"'> Event name without the 'on' prefix </param>
7750
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackKeyboard"> JavaScript function to register </param>
7751
- /// </function>
7752
- /// <function container="Fit.EventManager" name="Add" access="public">
7753
- /// <description> Registers event handler for specified event on given EventTarget </description>
7754
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7755
- /// <param name="event" type='"click" | "contextmenu" | "dblclick" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" | "mousewheel"'> Event name without the 'on' prefix </param>
7756
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackMouse"> JavaScript function to register </param>
7757
- /// </function>
7758
- /// <function container="Fit.EventManager" name="Add" access="public">
7759
- /// <description> Registers event handler for specified event on given EventTarget </description>
7760
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7761
- /// <param name="event" type='"popstate"'> Event name without the 'on' prefix </param>
7762
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackPopState"> JavaScript function to register </param>
7763
- /// </function>
7764
- /// <function container="Fit.EventManager" name="Add" access="public">
7765
- /// <description> Registers event handler for specified event on given EventTarget </description>
7766
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7767
- /// <param name="event" type='"hashchange"'> Event name without the 'on' prefix </param>
7768
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackHashChange"> JavaScript function to register </param>
7769
- /// </function>
7770
- /// <function container="Fit.EventManager" name="Add" access="public">
7771
- /// <description> Registers event handler for specified event on given EventTarget </description>
7772
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7773
- /// <param name="event" type='"focus" | "focusin" | "focusout" | "blur"'> Event name without the 'on' prefix </param>
7774
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackFocus"> JavaScript function to register </param>
7775
- /// </function>
7776
- /// <function container="Fit.EventManager" name="Add" access="public">
7777
- /// <description> Registers event handler for specified event on given EventTarget </description>
7778
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7779
- /// <param name="event" type='"beforeunload"'> Event name without the 'on' prefix </param>
7780
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackBeforeUnload"> JavaScript function to register </param>
7781
- /// </function>
7782
- /// <function container="Fit.EventManager" name="Add" access="public">
7783
- /// <description> Registers event handler for specified event on given EventTarget </description>
7784
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7785
- /// <param name="event" type='"cut" | "copy" | "paste"'> Event name without the 'on' prefix </param>
7786
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackClipboard"> JavaScript function to register </param>
7787
- /// </function>
7788
- /// <function container="Fit.EventManager" name="Add" access="public">
7789
- /// <description> Registers event handler for specified event on given EventTarget </description>
7790
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7791
- /// <param name="event" type='"storage"'> Event name without the 'on' prefix </param>
7792
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackStorage"> JavaScript function to register </param>
7793
- /// </function>
7794
- /// <function container="Fit.EventManager" name="Add" access="public">
7795
- /// <description> Registers handler for specified event on given DOMElement and returns Event ID </description>
7796
- /// <param name="element" type="DOMElement"> DOM element on to which event handler is registered </param>
7797
- /// <param name="event" type='"#rooted"'> Event name </param>
7798
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackRooted"> JavaScript function to register </param>
7799
- /// </function>
7800
- /// <function container="Fit.EventManager" name="Add" access="public">
7801
- /// <description> Registers handler for specified event on given DOMElement and returns Event ID </description>
7802
- /// <param name="element" type="DOMElement"> DOM element on to which event handler is registered </param>
7803
- /// <param name="event" type='"#mutation"'> Event name </param>
7804
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.MutationObserverCallback"> JavaScript function to register </param>
7805
- /// </function>
7806
- /// <function container="Fit.EventManager" name="Add" access="public">
7807
- /// <description> Registers event handler for specified event on given EventTarget </description>
7808
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7809
- /// <param name="event" type="string"> Event name without the 'on' prefix </param>
7810
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackGeneric"> JavaScript function to register </param>
7811
- /// </function>
7812
- // ------------------------------------------------------------------------------------------
7813
- // Overloads with options argument
7814
- // ------------------------------------------------------------------------------------------
7815
- /// <function container="Fit.EventManager" name="Add" access="public">
7816
- /// <description> Registers event handler for specified event on given EventTarget </description>
7817
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7818
- /// <param name="event" type='"keydown" | "keyup" | "keypress"'> Event name without the 'on' prefix </param>
7819
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7820
- /// Set additional options - not guaranteed to be cross browser compatible!
7821
- /// </param>
7822
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackKeyboard"> JavaScript function to register </param>
7823
- /// </function>
7824
- /// <function container="Fit.EventManager" name="Add" access="public">
7825
- /// <description> Registers event handler for specified event on given EventTarget </description>
7826
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7827
- /// <param name="event" type='"click" | "contextmenu" | "dblclick" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" | "mousewheel"'> Event name without the 'on' prefix </param>
7828
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7829
- /// Set additional options - not guaranteed to be cross browser compatible!
7830
- /// </param>
7831
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackMouse"> JavaScript function to register </param>
7832
- /// </function>
7833
- /// <function container="Fit.EventManager" name="Add" access="public">
7834
- /// <description> Registers event handler for specified event on given EventTarget </description>
7835
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7836
- /// <param name="event" type='"popstate"'> Event name without the 'on' prefix </param>
7837
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7838
- /// Set additional options - not guaranteed to be cross browser compatible!
7839
- /// </param>
7840
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackPopState"> JavaScript function to register </param>
7841
- /// </function>
7842
- /// <function container="Fit.EventManager" name="Add" access="public">
7843
- /// <description> Registers event handler for specified event on given EventTarget </description>
7844
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7845
- /// <param name="event" type='"hashchange"'> Event name without the 'on' prefix </param>
7846
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7847
- /// Set additional options - not guaranteed to be cross browser compatible!
7848
- /// </param>
7849
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackHashChange"> JavaScript function to register </param>
7850
- /// </function>
7851
- /// <function container="Fit.EventManager" name="Add" access="public">
7852
- /// <description> Registers event handler for specified event on given EventTarget </description>
7853
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7854
- /// <param name="event" type='"focus" | "focusin" | "focusout" | "blur"'> Event name without the 'on' prefix </param>
7855
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7856
- /// Set additional options - not guaranteed to be cross browser compatible!
7857
- /// </param>
7858
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackFocus"> JavaScript function to register </param>
7859
- /// </function>
7860
- /// <function container="Fit.EventManager" name="Add" access="public">
7861
- /// <description> Registers event handler for specified event on given EventTarget </description>
7862
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7863
- /// <param name="event" type='"beforeunload"'> Event name without the 'on' prefix </param>
7864
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7865
- /// Set additional options - not guaranteed to be cross browser compatible!
7866
- /// </param>
7867
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackBeforeUnload"> JavaScript function to register </param>
7868
- /// </function>
7869
- /// <function container="Fit.EventManager" name="Add" access="public">
7870
- /// <description> Registers event handler for specified event on given EventTarget </description>
7871
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7872
- /// <param name="event" type='"cut" | "copy" | "paste"'> Event name without the 'on' prefix </param>
7873
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7874
- /// Set additional options - not guaranteed to be cross browser compatible!
7875
- /// </param>
7876
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackClipboard"> JavaScript function to register </param>
7877
- /// </function>
7878
- /// <function container="Fit.EventManager" name="Add" access="public">
7879
- /// <description> Registers event handler for specified event on given EventTarget </description>
7880
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7881
- /// <param name="event" type='"storage"'> Event name without the 'on' prefix </param>
7882
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7883
- /// Set additional options - not guaranteed to be cross browser compatible!
7884
- /// </param>
7885
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackStorage"> JavaScript function to register </param>
7886
- /// </function>
7887
- /// <function container="Fit.EventManager" name="Add" access="public">
7888
- /// <description> Registers handler for specified event on given DOMElement and returns Event ID </description>
7889
- /// <param name="element" type="DOMElement"> DOM element on to which event handler is registered </param>
7890
- /// <param name="event" type='"#rooted"'> Event name </param>
7891
- /// <param name="options" type="{ Id?: string }">
7892
- /// This argument is ignored for the specialized #rooted event.
7893
- /// </param>
7894
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackRooted"> JavaScript function to register </param>
7895
- /// </function>
7896
- /// <function container="Fit.EventManager" name="Add" access="public">
7897
- /// <description> Registers handler for specified event on given DOMElement and returns Event ID </description>
7898
- /// <param name="element" type="DOMElement"> DOM element on to which event handler is registered </param>
7899
- /// <param name="event" type='"#mutation"'> Event name </param>
7900
- /// <param name="options" type="{ Id?: String, Deep?: boolean }">
7901
- /// This argument is ignored for the specialized #rooted event.
7902
- /// </param>
7903
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackRooted"> JavaScript function to register </param>
7904
- /// </function>
7905
- /// <function container="Fit.EventManager" name="Add" access="public">
7906
- /// <description> Registers event handler for specified event on given EventTarget </description>
7907
- /// <param name="element" type="EventTarget"> EventTarget (e.g. Window or DOMElement) on to which event handler is registered </param>
7908
- /// <param name="event" type="string"> Event name without 'on' prefix (e.g. 'load', 'mouseover', 'click' etc.) </param>
7909
- /// <param name="options" type="{ Id?: string, Capture?: boolean, Once?: boolean, Passive?: boolean }">
7910
- /// Set additional options - not guaranteed to be cross browser compatible!
7911
- /// </param>
7912
- /// <param name="eventFunction" type="Fit.EventsTypeDefs.EventHandlerCallbackGeneric"> JavaScript function to register </param>
7913
- /// </function>
7914
- this.Add = function(elmArg, eventArg, eventFunctionArg)
7915
- {
7916
- var element = elmArg;
7917
- var event = eventArg;
7918
- var eventFunction = arguments[3] !== undefined ? arguments[3] : eventFunctionArg;
7919
- var options = arguments.length === 4 ? arguments[2] : {};
7920
-
7921
- Fit.Validation.ExpectEventTarget(element);
7922
- Fit.Validation.ExpectStringValue(event);
7923
- Fit.Validation.ExpectFunction(eventFunction);
7924
- Fit.Validation.ExpectObject(options);
7925
- Fit.Validation.ExpectString(options && options.Id, true);
7926
- Fit.Validation.ExpectBoolean(options && options.Capture, true);
7927
- Fit.Validation.ExpectBoolean(options && options.Once, true);
7928
- Fit.Validation.ExpectBoolean(options && options.Passive, true);
7929
- Fit.Validation.ExpectBoolean(options && options.Deep, true);
7930
-
7931
- for (var prop in options || {})
7932
- {
7933
- if (Fit.Array.Contains(["Id", "Capture", "Once", "Passive", "Deep"], prop) === false)
7934
- {
7935
- throw "Unsupported options passed to Fit.EventManager.Add(..): " + prop;
7936
- }
7937
- }
7938
-
7939
- var reg =
7940
- {
7941
- Dom: element,
7942
- Event: event,
7943
- Handler: eventFunction,
7944
- Options: options
7945
- };
7946
-
7947
- if (reg.event === "#mutation")
7948
- {
7949
- Fit.Events.AddMutationObserver(reg.Dom, reg.Handler, reg.Options.Deep)
7950
- }
7951
- else
7952
- {
7953
- Fit.Events.AddHandler(reg.Dom, reg.Event, reg.Options, reg.Handler);
7954
- }
7955
-
7956
- Fit.Array.Add(registrations, reg);
7957
- }
7958
-
7959
- /// <function container="Fit.EventManager" name="Move" access="public">
7960
- /// <description> Move event handler by event ID to another DOMElement </description>
7961
- /// <param name="id" type="integer"> Event ID identifying handler to move </param>
7962
- /// <param name="newElm" type="DOMElement"> DOM element to which event handler is moved </param>
7963
- /// </function>
7964
- this.Move = function(id, newElm)
7965
- {
7966
- Fit.Validation.ExpectString(id);
7967
- Fit.Validation.ExpectEventTarget(newElm);
7968
-
7969
- Fit.Array.ForEach(registrations, function(reg)
7970
- {
7971
- if (reg.Options.Id === id)
7972
- {
7973
- if (reg.Event === "#mutation")
7974
- {
7975
- Fit.Events.RemoveMutationObserver(reg.Dom, reg.Handler, reg.Options.Deep);
7976
-
7977
- reg.Dom = newElm;
7978
- Fit.Events.AddMutationObserver(reg.Dom, reg.Handler, reg.Options.Deep);
7979
- }
7980
- else
7981
- {
7982
- Fit.Events.RemoveHandler(reg.Dom, reg.Event, reg.Options, reg.Handler);
7983
-
7984
- reg.Dom = newElm;
7985
- Fit.Events.AddHandler(reg.Dom, reg.Event, reg.Options, reg.Handler);
7986
- }
7987
- }
7988
- });
7989
- }
7990
-
7991
- /// <function container="Fit.EventManager" name="Remove" access="public">
7992
- /// <description> Removes event handler by event ID </description>
7993
- /// <param name="id" type="integer"> Event ID identifying handler to remove </param>
7994
- /// </function>
7995
- this.Remove = function(id)
7996
- {
7997
- Fit.Validation.ExpectString(id);
7998
-
7999
- var newRegistrations = [];
8000
-
8001
- Fit.Array.ForEach(registrations, function(reg)
8002
- {
8003
- if (reg.Options.Id === id)
8004
- {
8005
- if (reg.Event === "#mutation")
8006
- {
8007
- Fit.Events.RemoveMutationObserver(reg.Dom, reg.Handler, reg.Options.Deep);
8008
- }
8009
- else
8010
- {
8011
- Fit.Events.RemoveHandler(reg.Dom, reg.Event, reg.Options, reg.Handler);
8012
- }
8013
- }
8014
- else
8015
- {
8016
- Fit.Array.Add(newRegistrations, reg);
8017
- }
8018
- });
8019
-
8020
- registrations = newRegistrations;
8021
- }
8022
-
8023
- /// <function container="Fit.EventManager" name="RemoveAll" access="public">
8024
- /// <description> Remove all event handlers registered </description>
8025
- /// </function>
8026
- this.RemoveAll = function()
8027
- {
8028
- Fit.Array.ForEach(registrations, function(reg)
8029
- {
8030
- if (reg.Event === "#mutation")
8031
- {
8032
- Fit.Events.RemoveMutationObserver(reg.Dom, reg.Handler, reg.Options.Deep);
8033
- }
8034
- else
8035
- {
8036
- Fit.Events.RemoveHandler(reg.Dom, reg.Event, reg.Options, reg.Handler);
8037
- }
8038
- });
8039
-
8040
- registrations = [];
8041
- }
8042
-
8043
- /// <function container="Fit.EventManager" name="Move" access="public">
8044
- /// <description> Invoke event handler by event ID </description>
8045
- /// <param name="id" type="integer"> Event ID identifying handler to invoke </param>
8046
- /// <param name="args" type="any[]" default="undefined"> Event handler arguments </param>
8047
- /// <param name="thisArg" type="any" default="undefined"> The value 'this' resolves to within event handler </param>
8048
- /// </function>
8049
- this.Invoke = function(id, args, thisArg)
8050
- {
8051
- Fit.Validation.ExpectString(id);
8052
- Fit.Validation.ExpectArray(args, true);
8053
-
8054
- Fit.Array.ForEach(registrations, function(reg)
8055
- {
8056
- if (reg.Options.Id === id)
8057
- {
8058
- reg.Handler.apply(thisArg || reg.Dom, args || [])
8059
- }
8060
- });
8061
- }
8062
-
8063
- // this.dump = function()
8064
- // {
8065
- // console.log(registrations);
8066
- // }
8067
- }
8068
7723
  /// <container name="Fit.Events">
8069
7724
  /// Event handler functionality
8070
7725
  /// </container>
@@ -8453,7 +8108,7 @@ Fit.Events.RemoveHandler = function()
8453
8108
  var handler = ((element._internal && element._internal.Events && element._internal.Events.Handlers) ? element._internal.Events.Handlers[arguments[1]] : undefined);
8454
8109
 
8455
8110
  if (handler === undefined)
8456
- Fit.Validation.Throw("No event handler with ID '" + arguments[0] + "' exists for this element");
8111
+ return; // Not found
8457
8112
 
8458
8113
  if (handler === null)
8459
8114
  return; // Already removed
@@ -8484,6 +8139,8 @@ Fit.Events.RemoveHandler = function()
8484
8139
  Fit.Validation.ExpectBoolean(useCaptureOrOptions && useCaptureOrOptions.Passive || true);
8485
8140
  Fit.Validation.ExpectFunction(eventFunction);
8486
8141
 
8142
+ // Remove event handler
8143
+
8487
8144
  if (event.toLowerCase() === "#rooted")
8488
8145
  {
8489
8146
  var handlers = Fit._internal.Events.OnRootedHandlers;
@@ -8543,20 +8200,28 @@ Fit.Events.RemoveHandler = function()
8543
8200
  element.detachEvent("on" + event, eventFunction);
8544
8201
  }
8545
8202
 
8546
- if (arguments.length === 2)
8547
- {
8548
- element._internal.Events.Handlers[arguments[1]] = null;
8549
- }
8550
- else
8203
+ // Remove event handler information from element
8204
+
8205
+ if (element._internal) // Missing if disposed through Component.Dispose() which removes the _internal property - nothing to clean up in this case
8551
8206
  {
8552
- for (var i = 0 ; i < element._internal.Events.Handlers.length ; i++)
8207
+ if (element._internal.Events) // Only defined if an event has been registered through Fit.Events.AddHandler(..)
8553
8208
  {
8554
- var handler = element._internal.Events.Handlers[i];
8555
-
8556
- if (handler !== null && event.toLowerCase() === handler.Event.toLowerCase() && eventFunction === handler.Handler && Fit.Core.IsEqual(useCaptureOrOptions, handler.UseCaptureOrOptions) === true)
8209
+ if (arguments.length === 2)
8557
8210
  {
8558
- element._internal.Events.Handlers[i] = null;
8559
- break;
8211
+ element._internal.Events.Handlers[arguments[1]] = null;
8212
+ }
8213
+ else
8214
+ {
8215
+ for (var i = 0 ; i < element._internal.Events.Handlers.length ; i++)
8216
+ {
8217
+ var handler = element._internal.Events.Handlers[i];
8218
+
8219
+ if (handler !== null && event.toLowerCase() === handler.Event.toLowerCase() && eventFunction === handler.Handler && Fit.Core.IsEqual(useCaptureOrOptions, handler.UseCaptureOrOptions) === true)
8220
+ {
8221
+ element._internal.Events.Handlers[i] = null;
8222
+ break;
8223
+ }
8224
+ }
8560
8225
  }
8561
8226
  }
8562
8227
  }
@@ -8761,7 +8426,7 @@ setInterval(function()
8761
8426
 
8762
8427
  Fit.Array.ForEach(Fit._internal.Events.OnRootedHandlers, function(handler)
8763
8428
  {
8764
- if (handler.Removed === true)
8429
+ if (handler.Removed === true || handler.Element._internal === undefined) // Removed through RemoveHandler(..), or disposed through Component.Dispose() which removes the _internal property
8765
8430
  {
8766
8431
  Fit.Array.Add(remove, handler);
8767
8432
  return; // Skip to next
@@ -9217,7 +8882,7 @@ Fit._internal.Events.CheckMutations = function()
9217
8882
  // Re-throw error if observer failed
9218
8883
 
9219
8884
  if (error !== null)
9220
- Fit.Validation.Throw(error);
8885
+ Fit.Validation.ThrowError(error);
9221
8886
  }
9222
8887
  });
9223
8888
 
@@ -20131,9 +19796,9 @@ Fit.Controls.DropDown = function(ctlId)
20131
19796
  // container starts.
20132
19797
  // https://github.com/Jemt/Fit.UI/issues/51
20133
19798
 
20134
- var scrollParent = Fit.Dom.GetScrollParent(me.GetDomElement());
19799
+ var scrollParent = Fit.Dom.GetScrollParent(me.GetDomElement()); // Null if DropDown or a parent has position:fixed
20135
19800
 
20136
- if (scrollParent !== Fit.Dom.GetScrollDocument())
19801
+ if (scrollParent !== null && scrollParent !== Fit.Dom.GetScrollDocument())
20137
19802
  {
20138
19803
  // Control is positioned within a container with scroll.
20139
19804
  // Calculate position relative to viewport to determine
@@ -20162,10 +19827,10 @@ Fit.Controls.DropDown = function(ctlId)
20162
19827
  // container ends.
20163
19828
  // https://github.com/Jemt/Fit.UI/issues/51 (see re-open comment oct. 30, 2020)
20164
19829
 
20165
- var scrollParent = Fit.Dom.GetScrollParent(me.GetDomElement());
19830
+ var scrollParent = Fit.Dom.GetScrollParent(me.GetDomElement()); // Null if DropDown or a parent has position:fixed
20166
19831
  var alternativeTopPos = -1;
20167
19832
 
20168
- if (scrollParent !== Fit.Dom.GetScrollDocument())
19833
+ if (scrollParent !== null && scrollParent !== Fit.Dom.GetScrollDocument())
20169
19834
  {
20170
19835
  // Control is positioned within a container with scroll.
20171
19836
  // Calculate position relative to viewport to determine
@@ -22114,7 +21779,7 @@ Fit.Controls.WSDropDown = function(ctlId)
22114
21779
 
22115
21780
  Fit.Internationalization.RemoveOnLocaleChanged(localize);
22116
21781
 
22117
- me = list = tree = actionMenu = search = forceNewSearch = hideLinesForFlatData = dataRequested = dataLoading /*= nodesPopulated*/ = requestCount = onDataLoadedCallback = suppressTreeOnOpen = timeOut = currentRequest = classes = autoUpdatedSelections = useActionMenu = useActionMenuForced = useActionMenuAfterLoad = useActionMenuSortingLocale = useActionMenuHtmlAllowed = treeViewEnabled = orgPlaceholder = customPlaceholderSet = translations = onRequestHandlers = onResponseHandlers = null;
21782
+ me = list = tree = actionMenu = search = forceNewSearch = hideLinesForFlatData = dataRequested = dataLoading /*= nodesPopulated*/ = requestCount = onDataLoadedCallback = suppressTreeOnOpen = timeOut = currentRequest = classes = autoUpdatedSelections = useActionMenu = useActionMenuForced = useActionMenuAfterLoad = useActionMenuSortingLocale = useActionMenuHtmlAllowed = treeViewEnabled = orgPlaceholder = customPlaceholderSet = translations = onRequestHandlers = onResponseHandlers = onAbortHandlers /*= onPopulatedHandlers*/ = null;
22118
21783
 
22119
21784
  base();
22120
21785
  });
@@ -32832,9 +32497,9 @@ Fit.Controls.WSTreeView = function(ctlId)
32832
32497
 
32833
32498
  // Preserve scroll position in case user scrolled view while data was loading. Calling node.Focused(true)
32834
32499
  // or SetActiveNode(..) further down will not only focus or highlight node, but also scroll it into view.
32835
- var scrollbars = Fit.Dom.GetScrollBars(me.GetDomElement());
32836
- var scrollParent = scrollbars.Vertical.Enabled === true || scrollbars.Horizontal.Enabled === true ? me.GetDomElement() : Fit.Dom.GetScrollParent(me.GetDomElement());
32837
- var scrollPositionToRestore = keepState === true ? { Top: scrollParent.scrollTop, Left: scrollParent.scrollLeft } : null;
32500
+ var scrollbars = Fit.Dom.GetScrollBars(me.GetDomElement()); // Scrollbars not enabled when no data is loaded to overflow own container
32501
+ var scrollParent = scrollbars.Vertical.Enabled === true || scrollbars.Horizontal.Enabled === true ? me.GetDomElement() : Fit.Dom.GetScrollParent(me.GetDomElement()); // Null if data is not causing local scroll and if WSTreeView is not mounted in another scrollable container (likely within a parent with position:fixed)
32502
+ var scrollPositionToRestore = scrollParent !== null && keepState === true ? { Top: scrollParent.scrollTop, Left: scrollParent.scrollLeft } : null;
32838
32503
 
32839
32504
  // Remove nodes
32840
32505
  me._internal.ExecuteWithNoOnChange(function()