You can query the computed lengths of the string that should go on the path, and the length of the path. Then compare the two, if the string length is longer than the path length then text will fall off the path.
You can also use the knowledge of the path length to squeeze the string to fit, like this:
<svg viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="s3" d="M 10,90 Q 100,15 200,70 "/>
</defs>
<g>
<text font-size="20">
<textPath xlink:href="#s3" textLength="204" lengthAdjust="spacingAndGlyphs">
The quick brown fox jumps over the lazy dog
</textPath>
</text>
<use x="0" y="0" xlink:href="#s3" stroke="black" fill="none"/>
</g>
</svg>
Here's an example where the string length is manipulated by decreasing the font-size:
<svg viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="s3" d="M 10,90 Q 100,15 200,70 "/>
</defs>
<g>
<text font-size="20" font-family="Arial,Helvetica,sans-serif">
<textPath id="tp" xlink:href="#s3" lengthAdjust="spacingAndGlyphs">
The quick brown fox jumps over the lazy dog
</textPath>
</text>
<use x="0" y="0" xlink:href="#s3" stroke="black" fill="none"/>
</g>
<script><![CDATA[
var textpath = document.getElementById("tp");
var path = document.getElementById("s3");
var fontsize = 20;
while (textpath.getComputedTextLength() > path.getTotalLength())
{
fontsize -= 0.01;
textpath.setAttribute("font-size", fontsize);
}
]]></script>
</svg>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…