1

我有一个通过文本区域循环的应用程序,搜索特定文本,如果找到则突出显示它,并提示用户是否对找到的文本采取行动。这在 IE10 之前的所有 IE 版本上运行良好(文本突出显示,并提示用户)。

在 IE10 中,range.select 将不再突出显示文本,因为似乎是 CONFIRM 提示。如果 CONFIRM 被删除,文本将突出显示。同样在 IE 10 上,在最后一个 CONFIRM 确定后,文本的最后一个实例会在表单返回焦点时突出显示。

下面是一个代码片段,可以证明这一点,在 IE 5、6、7、8、9 下可以正常工作,但在 IE10 上会失败。任何有关重新设计或其他代码替代方案的帮助将不胜感激。我只需要它在 IE 环境中工作(内部应用程序,仅限于 IE 使用)。


<html>
<body>

<form name="theForm">
   <textarea name="message" rows="20" cols="80">NAM/JONES  NAM/SMITH   NAM/BROWN</textarea>
</form>

<script>
   var message = document.theForm.message.value.toUpperCase();
   var range = document.theForm.message.createTextRange();

   for (x=0; x<message.length-1; x++) {
      if (message.substr(x,4) == "NAM/") {
         var strFound=range.findText("NAM/");
         if (strFound) range.select();
         range.collapse(false);
         msg = "Process this name?";
         if (confirm(msg)) {
            // use x.substr to extract name, and do something
         }
      }
   }
</script>

</body>
</html>

4

1 回答 1

0

我有类似的问题,我根据你的和我们有问题的代码做了一个演示

<?xml version="1.0" encoding="ISO-8859-1" ?>
<html>
<head>
    <title></title>
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
</head>
<body>

    <form name="theForm">
        <input type="text" id="txt" value="1234567890" />
        <span id="selected" />
    </form>

    <script>
        function selectRange(start, end) {
            var range = document.theForm.txt.createTextRange();
            range.moveStart("character", 0 - end);
            range.moveEnd("character", 0 - end);
            range.select();
            // Und dann den neu hinzugekommenen Teil markieren.
            range.moveStart("character", start);
            range.moveEnd("character", end - start);
            range.select();
        }
        function step(x) {
            if (x >= document.theForm.txt.value.length - 2)
                return;
            selectRange(x, x + 2);
            document.getElementById("selected").innerHTML = document.selection.createRange().text;
            window.setTimeout(function () { step(x + 1); }, 1000);
        }
        step(0);
    </script>

</body>
</html>

事实证明,range.select();当它发生在setTimeout().

我们最终将有问题的函数完全放入了 settimeout

this.selectTextRange = function (start, end) {
    window.setTimeout(function() {
        var range = thisControl.textBox.createTextRange();
        // Ganz an den Anfang moven     
        range.moveStart("character", 0 - end);
        range.moveEnd("character", 0 - end);
        range.select();
        // Und dann den neu hinzugekommenen Teil markieren.
        range.moveStart("character", start);
        range.moveEnd("character", end - start);
        range.select();
    }, 0);
};

我希望这有帮助。

于 2013-11-20T11:30:35.263 回答