diff --git a/djhtml/modes.py b/djhtml/modes.py
index 56b57e9..90e0b27 100644
--- a/djhtml/modes.py
+++ b/djhtml/modes.py
@@ -500,7 +500,7 @@ def create_token(
# Tokens that mess with relative offset
elif raw_token.lstrip().startswith("..."):
token = Token.Text(raw_token, mode=DjJS)
- elif not line and raw_token.lstrip().startswith((".", ": ", "? ")):
+ elif not line and raw_token.lstrip().startswith((".", "?.", ": ", "? ")):
token = Token.Text(raw_token, mode=DjJS, relative=1)
elif not line and raw_token in ["if", "else", "for", "while"]:
token = Token.Text(raw_token, mode=DjJS, **self.offsets)
diff --git a/tests/suite/js.html b/tests/suite/js.html
index c8f0c6a..89b89ea 100644
--- a/tests/suite/js.html
+++ b/tests/suite/js.html
@@ -373,6 +373,14 @@
+
+
+
+
', mode=DjHTML)])
Line([])
Line([])
+Line([Open('', mode=DjHTML, ignore=True)], ignore=True)
+Line([Text('<', mode=DjHTML), Text('script', mode=InsideHTMLTag, absolute=8), Open('>', mode=DjHTML)])
+Line([Text(' ', mode=DjJS), Text('const ', mode=DjJS), Text('ids = a?.b', mode=DjJS, absolute=6)], level=1)
+Line([Text(' ?.filter', mode=DjJS, relative=1), Open('(', mode=DjJS, level=2), Text('o => o > 0', mode=DjJS), Close(')', mode=DjJS)], level=2)
+Line([Text(' .map', mode=DjJS, relative=1), Open('(', mode=DjJS, level=2), Text('o => o.id', mode=DjJS), Close(')', mode=DjJS), Text(' || ', mode=DjJS), Open('[', mode=DjJS, level=2), Close(']', mode=DjJS), Text(';', mode=DjJS)], level=2)
+Line([Close('', mode=DjHTML)])
+Line([])
+Line([])
Line([Open('', mode=DjHTML, ignore=True)], ignore=True)
Line([Text('<', mode=DjHTML), Text('script', mode=InsideHTMLTag, absolute=8), Open('>', mode=DjHTML)])
Line([Text(' ', mode=DjJS), Text('var ', mode=DjJS), Text('foo = ', mode=DjJS, absolute=4), Text("'\\'{'", mode=DjJS, relative=1, absolute=4)], level=1)