Skip to content

Commit 94ac93f

Browse files
committed
fix(scrollspy): remove errors when element not found
1 parent e95bbf3 commit 94ac93f

File tree

6 files changed

+368
-24
lines changed

6 files changed

+368
-24
lines changed

docs/js/init.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@ document.addEventListener("DOMContentLoaded", function() {
196196
});
197197

198198
M.Dropdown.init(document.querySelectorAll('.dropdown-trigger'), {});
199-
M.Dropdown.init(document.querySelector('#left'), {alignment: 'left', constrainWidth: false});
200-
M.Dropdown.init(document.querySelector('#right'), {alignment: 'right', constrainWidth: false});
199+
M.Dropdown.init(document.querySelector('#dropdown-demo-left'), {alignment: 'left', constrainWidth: false});
200+
M.Dropdown.init(document.querySelector('#dropdown-demo-right'), {alignment: 'right', constrainWidth: false});
201201

202202
M.Parallax.init(document.querySelectorAll('.parallax'), {});
203203

docs/js/materialize.js

+348-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pug/mobile/mobile_content.html

+8-12
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
<div class="container">
22
<div class="row">
33
<div class="col s12 m8 offset-m1 xl7 offset-xl1">
4-
5-
<!-- Sidenav -->
4+
<!-- Sidenav -->
65
<div id="right" class="section scrollspy">
76
<h3 class="header">Navbar</h3>
87
<p class="caption">The navbar is fully contained by an HTML5 Nav tag. Inside a recommended container div, there are 2 main parts of the navbar. A logo or brand link, and the navigations links. You can align these links to the left or right.
98
</p>
109
<h4>Drag Out Menu</h4>
1110
<p>This plugin includes several options for customizing the menu. See <a href="sidenav.html#options">Plugin Options</a> for details.</p>
1211
<img class="mobile-image" src="images/menu.gif">
13-
1412
</div>
15-
16-
<!-- Toast -->
17-
<div id="toast-mobile" class="section scrollspy">
18-
<h3 class="header">Toast</h3>
19-
<h4>Swipe to Dismiss</h4>
20-
<p>On all devices, you can swipe to dismiss toasts.</p>
21-
<img class="mobile-image" src="images/toast.gif">
22-
23-
</div>
13+
<!-- Toast -->
14+
<div id="toast-mobile" class="section scrollspy">
15+
<h3 class="header">Toast</h3>
16+
<h4>Swipe to Dismiss</h4>
17+
<p>On all devices, you can swipe to dismiss toasts.</p>
18+
<img class="mobile-image" src="images/toast.gif">
19+
</div>
2420
</div>
2521
<div class="col hide-on-small-only m3 xl3 offset-xl1">
2622
<div class="toc-wrapper">

pug/page-contents/dropdown_content.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ <h4>Examples</h4>
175175
<div class="row">
176176
<div class="col s12 m6">
177177
<!-- Dropdown Trigger 1 -->
178-
<a id="left" class='dropdown-trigger btn' href='#' data-target='dropdown2' style='width: 100%'>Left DropDown!</a>
178+
<a id="dropdown-demo-left" class='dropdown-trigger btn' href='#' data-target='dropdown2' style='width: 100%'>Left DropDown!</a>
179179
<!-- Dropdown Structure 1 -->
180180
<ul id='dropdown2' class='dropdown-content'>
181181
<li><a href="#!">one</a></li>
@@ -188,7 +188,7 @@ <h4>Examples</h4>
188188
</div>
189189
<div class="col s12 m6">
190190
<!-- Dropdown Trigger 2 -->
191-
<a id="right" class='dropdown-trigger btn' href='#' data-target='dropdown3' style='width: 100%'>Right DropDown!</a>
191+
<a id="dropdown-demo-right" class='dropdown-trigger btn' href='#' data-target='dropdown3' style='width: 100%'>Right DropDown!</a>
192192
<!-- Dropdown Structure 2 -->
193193
<ul id='dropdown3' class='dropdown-content'>
194194
<li><a href="#!">one</a></li>

src/dropdown.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ import anim from "animejs";
9191
// Trigger keydown handler
9292
this.el.addEventListener('keydown', this._handleTriggerKeydownBound);
9393
// Item click handler
94-
this.dropdownEl.addEventListener('click', this._handleDropdownClickBound);
94+
this.dropdownEl?.addEventListener('click', this._handleDropdownClickBound);
9595
// Hover event handlers
9696
if (this.options.hover) {
9797
this._handleMouseEnterBound = this._handleMouseEnter.bind(this);
@@ -303,6 +303,7 @@ import anim from "animejs";
303303
}
304304

305305
_makeDropdownFocusable() {
306+
if (!this.dropdownEl) return;
306307
// Needed for arrow key navigation
307308
this.dropdownEl.tabIndex = 0;
308309
// Only set tabindex if it hasn't been set by user

src/scrollspy.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ let _defaults = {
178178

179179
if (ScrollSpy._visibleElements[0]) {
180180
const actElem = document.querySelector(this.options.getActiveElement(ScrollSpy._visibleElements[0].id));
181-
actElem.classList.remove(this.options.activeClass);
181+
actElem?.classList.remove(this.options.activeClass);
182182

183183
if (ScrollSpy._visibleElements[0].M_ScrollSpy && this.id < ScrollSpy._visibleElements[0].M_ScrollSpy.id) {
184184
ScrollSpy._visibleElements.unshift(this.el);
@@ -190,23 +190,23 @@ let _defaults = {
190190
else {
191191
ScrollSpy._visibleElements.push(this.el);
192192
}
193-
document.querySelector(this.options.getActiveElement(ScrollSpy._visibleElements[0].id))
194-
.classList.add(this.options.activeClass);
193+
const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);
194+
document.querySelector(selector)?.classList.add(this.options.activeClass);
195195
}
196196

197197
_exit() {
198198
ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(value => value.getBoundingClientRect().height !== 0);
199199

200200
if (ScrollSpy._visibleElements[0]) {
201201
const actElem = document.querySelector(this.options.getActiveElement(ScrollSpy._visibleElements[0].id));
202-
actElem.classList.remove(this.options.activeClass);
202+
actElem?.classList.remove(this.options.activeClass);
203203

204204
ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter((x) => x.id != this.el.id);
205205

206206
if (ScrollSpy._visibleElements[0]) {
207207
// Check if empty
208-
document.querySelector(this.options.getActiveElement(ScrollSpy._visibleElements[0].id))
209-
.classList.add(this.options.activeClass);
208+
const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);
209+
document.querySelector(selector)?.classList.add(this.options.activeClass);
210210
}
211211
}
212212
}

0 commit comments

Comments
 (0)