【问题标题】:IE won't clear textarea valueIE 不会清除 textarea 值
【发布时间】:2013-10-06 10:57:21
【问题描述】:

再次回到我的框架。我有一个方法可以获取元素的值,清除 dom 中元素的值,然后一个字母一个字母地放回去。在 Chome、FF 和 IE (10) 中对其进行了测试。一切正常。但是IE有个小问题。如果我在脚本执行时刷新页面,它不会清除元素的值。或者在它之后,并没有真正的不同。

<textarea cols="60" id="textarea">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas suscipit lacus non hendrerit cursus.
</textarea>

<script>
(function(){
    (this[arguments[0]] = function selector(id){
        if(!(this instanceof selector)) {
            return new selector(id);
        }
        this.elm = document.getElementById(id);
    }).prototype = {
        type:       function(delay) {
                        var elm = this.elm;
                        var status;
                        if ('value' in elm) {
                                var text = elm.value;
                                elm.value = "";
                                status = 0;
                            } else if ('innerHTML' in elm)  {
                                var text = elm.innerHTML;
                                elm.innerHTML = "";
                                status = 1;
                            }
                        var letters = text.split("");
                        var counter = 0;
                        function write() {
                            if (counter < letters.length) {
                                switch (status) {
                                    case 0: elm.value += letters[counter];      break;
                                    case 1: elm.innerHTML += letters[counter];  break;
                                }
                            }
                            counter += 1;
                        }
                        setInterval(write, delay);
                    },
   };
})('$');

$('textarea').type("100");

FIDDLE

这是与 IE 相关的问题还是我在代码中遗漏了什么?我觉得可能是IE>.>

【问题讨论】:

    标签: javascript internet-explorer frameworks


    【解决方案1】:

    我很确定这是与 IE 相关的问题。 IE 10 尝试对用户友好,即使在页面刷新后也会在 textareas 中保留更改的输入文本。

    现在的问题是:您的脚本在 IE 恢复上一页加载的文本之前已经尝试清除文本区域。因此,您的脚本会将新文本添加到旧文本中。

    所以一个简单的解决方法是在启动typefunction 并清除 textarea 之前给 IE 一点时间来恢复文本。但是,您必须在 IE 覆盖之前获取 textarea 的原始内容。

    我在查看您的代码时注意到的一件事:使用setInterval 来实现这种效果是个坏主意,因为即使在将完整文本写入文本区域之后,该函数仍将永远运行(并计数);你必须使用clearInterval

    这是更正的代码(更改已注释)。这适用于我在 FF、IE 10 和 Chrome 中。

    (function(){
        (this[arguments[0]] = function selector(id){
            if(!(this instanceof selector)) {
                return new selector(id);
            }
            this.elm = document.getElementById(id);
            this.elm.setAttribute("autocomplete", "off");
        }).prototype = {
            type: function(delay) {
                var elm = this.elm;
                var status;
                // Don't clear textarea here, won't have any effect; but get original textarea content
                if ('value' in elm) {
                    var text = elm.value;
                    status = 0;
                }
                else if ('innerHTML' in elm)  {
                    var text = elm.innerHTML;
                    status = 1;
                }
                var letters = text.split("");
                var counter = 0;
                var interval;
                function write() {
                    if (counter < letters.length) {
                        switch (status) {
                            case 0: elm.value += letters[counter];      break;
                            case 1: elm.innerHTML += letters[counter];  break;
                        }
                    }
                    else {
                        // Clear timer
                        clearInterval(interval);
                    }
                    counter += 1;
                }
                setTimeout(function(){
                    // Clear textarea after waiting a little; using 0 as timeout value should be perfect, no need for higher values
                    if (status == 0) {
                        elm.value = "";
                    }
                    else {
                        elm.innerHTML = "";
                    }
                    interval = setInterval(write, delay);
                }, 0);
            },
        };
    })('$');
    
    $('textarea').type("100");
    

    【讨论】:

    • 这段代码似乎解决了问题,但也创建了另一个问题。如果我在页面加载后打印文本之前重新加载页面 - 比如说在中间 - 页面加载后,它将不会打印整个文本。它在我加载页面的位置停止打印。这发生在 IE 和 FF 中。在 Chrome 中它工作正常。
    • 嗯,我没有测试过。 ^^ 这是 FF 的解决方法:在 selector 类的末尾添加 this.elm.setAttribute("autocomplete", "off");(请参阅 this question)。不过,我仍在寻找同样适用于 IE 的解决方案...
    • 我已经编辑了我的答案以提供更通用的解决方案;它现在应该可以在 FF、IE 10 和 Chrome 中运行了。
    猜你喜欢
    • 2014-12-12
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多