代码之家  ›  专栏  ›  技术社区  ›  Mer

文本输入中的打字机效果在Firefox中不起作用

  •  1
  • Mer  · 技术社区  · 7 年前

    此代码在输入中产生打字机动画效果。当用户将鼠标悬停在输入上时,它会为占位符文本设置动画。当用户离开时,我希望动画停止,输入返回到其原始状态。

    $(function() {
    
        var sppInput,
            sppInputName = $('#spp-input-name'),
            sppInputNamePlace = sppInputName.attr('placeholder');
    
        // Typewriter Effect
        function sppInputStart(elm, n, text) {
            if (n < (text.length)) {
                $(elm).attr('placeholder', text.substring(0, n + 1));
                n++;
                sppInput = setTimeout(function () {
                    sppInputStart(elm, n, text);
                }, 80);
            }
        }
        function sppInputStop(elm, place) {
            clearTimeout(sppInput);
            $(elm).attr('placeholder', place);
        }
    
        // Typewriter Effect for Name
        sppInputName.mouseover(function () {
            sppInputStart(this, 0, sppInputName.data('typewriter'));
        });
        sppInputName.mouseout(function () {
            sppInputStop(this, sppInputNamePlace);
        });
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input placeholder="Name" data-typewriter="Insert the Name" type="text" id="spp-input-name" name="name" required>

    此代码适用于所有浏览器(包括IE),但不适用于firefox。

    为什么?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jaromanda X    7 年前

    看起来要更改 placeholder 值重新触发器 mouseover 事件

    一种有效的“黑客”:

    $(document).ready(function() {
    
        var sppInput,
            sppInputName = $('#spp-input-name'),
            sppInputNamePlace = sppInputName.attr('placeholder');
    
        // Typewriter Effect
        function sppInputStart(elm, n, text) {
            if (n < (text.length)) {
                $(elm).attr('placeholder', text.substring(0, n + 1));
                n++;
                sppInput = setTimeout(function() {
                    sppInputStart(elm, n, text);
                }, 80);
            }
        }
    
        function sppInputStop(elm, place) {
            clearTimeout(sppInput);
            $(elm).attr('placeholder', place);
        }
    
        // Typewriter Effect for Name
        sppInputName.mouseover(function() {
            // hack
            if ($(this).data('flag') != '1') {
                $(this).data('flag', '1');
                sppInputStart(this, 0, sppInputName.data('typewriter'));
            }
        });
        sppInputName.mouseout(function() {
            // hack
            $(this).data('flag', '0');
            sppInputStop(this, sppInputNamePlace);
        });
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input placeholder="Name" data-typewriter="Insert the Name" type="text" id="spp-input-name" name="name" required>
        2
  •  0
  •   Keith    7 年前

    在Firefox中 mouseover mouseout 多次开火。事实上,很多事情都会导致它们重新燃烧。在这里,更改占位符属性可以做到这一点,可能是因为FX在更改视觉内容后正在重新计算布局。其他浏览器中可能存在您尚未发现的类似问题。

    你不能依赖 鼠标悬停 灭鼠器 (或任何姿势事件)只需开火一次即可开始效果,并再次停止效果。

    相反,将其设为输入状态并切换标志:

    $(function() {
    
        var sppInput,
            sppInputName = $('#spp-input-name'),
            sppInputNamePlace = sppInputName.attr('placeholder'),
            inputAnimating = false;
    
        // Typewriter Effect
        function sppInputStart(elm, n, text) {
            if(!inputAnimating) {
                setTimeout(function () {
                    sppInputStart(elm, n, text);
                }, 500);
                return;
            }
            
            if (n < (text.length)) {
                $(elm).attr('placeholder', text.substring(0, n + 1));
                n++;
                sppInput = setTimeout(function () {
                    sppInputStart(elm, n, text);
                }, 80);
            }
        }
        function sppInputStop(elm, place) {
            clearTimeout(sppInput);
            $(elm).attr('placeholder', place);
        }
    
        // Typewriter Effect for Name
        sppInputName.mouseover(function () {
            inputAnimating = true;
        });
        sppInputName.mouseout(function () {
            inputAnimating = false;
        });
        
        sppInputStart(sppInputName, 0, sppInputName.data('typewriter'));
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input placeholder="Name" data-typewriter="Insert the Name" type="text" id="spp-input-name" name="name" required>

    这在FX中有效。

    但是,请考虑使用 requestAnimationFrame 或者使用 placeholder 属性,因为这可能会导致帧丢失,尤其是在移动设备上。

    您还可能会导致各种问题,因为屏幕阅读器在读取您正在更改的属性时会遇到问题,每次更改时间为80ms。