【问题标题】:javascript works differently in deployed IE vs VS debugger, ff, chrome etcjavascript 在部署的 IE 与 VS 调试器、ff、chrome 等中的工作方式不同
【发布时间】:2014-01-08 16:02:07
【问题描述】:

更新: 我使用了 IE 调试控制台,结果发现“setSelectionRange”在 IE 中无效......为什么它可以在 Visual Studio 中工作,但不能在它之外工作,这超出了我的范围,但基本上 JS 在那一行失败了,而且永远不会返回false...所以现在的问题是:我怎样才能以不同的方式对其进行编码,以便IE 能够执行?我试图寻找 JQuery 插件,但还没有找到...

所以我已经通过一些 javascript 完成了一些验证,并且还对 gridview 中的一些文本框进行了一些预填充。该代码应该从 onkeypress 事件中调用。它在调试模式下工作得很好......字符仅限于数字,并且 y 和 m 键按下自动填充/附加单词年或月,并且光标正确定位在数字部分的末尾。它也适用于 Chrome 和 FF。但是,我们公司的大多数运行在 IE9 上(我的电脑上的 IE10 也出现了这个问题。)一旦我部署了 aspx 页面,IE 用户仍然得到字符限制和自动填充,但字符 y 和 m 没有被抑制,并且光标位置不会发生,因此光标位于“9 Yearsy”或“6 Monthsm”的末尾。下面列出了javascript;我知道 javascript 实现背后有一些怪癖,但为什么它只会在我部署代码之后发生。任何有关如何解决此问题的建议将不胜感激...

    var timeFrame = function (evt, txtbox, max) {
    if (evt.type != 'blur') {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31
                  && (charCode < 48 || charCode > 57)) {
                    if (charCode == 121 || charCode == 109) {
                        if (charCode == 121) {
                            //fill with years
                            var entry = (txtbox.value);
                            var words = entry.split(' ');
                            if (max) {
                                txtbox.value = 'Maximum '.concat(words[1], ' Years');
                                txtbox.setSelectionRange(8 + words[1].length, 8 + words[1].length);
                                return false;
                            } else {
                                txtbox.value = words[0].concat(' Years');
                                txtbox.setSelectionRange(words[0].length, words[0].length);
                                return false;
                            }

                        }
                        if (charCode == 109) {
                            //fill with months
                            var entry = (txtbox.value);
                            var words = entry.split(' ');
                            if (max) {
                                txtbox.value = 'Maximum '.concat(words[1], ' Months');
                                txtbox.setSelectionRange(8 + words[1].length, 8 + words[1].length);
                                return false;
                            } else {
                                txtbox.value = words[0].concat(' Months');
                                txtbox.setSelectionRange(words[0].length, words[0].length);
                                return false;
                            }

                        }
                    } else {
                        return false;
                    }
                }
                var str = txtbox.value;
                if (str != '') {
                    if (charCode == 46 && str.indexOf('.') !== -1) {
                        return false;
                    }
                    if (max) {
                        if (txtbox.value.indexOf('Maximum') == -1) {
                            txtbox.value = 'Maximum '.concat(str);
                            str = txtbox.value;
                        }

                        var words = str.split(' ');
                        if (isNaN(parseInt(words[1]))) {
                            txtbox.value = '';
                        } else {
                            txtbox.setSelectionRange(8 + words[1].length, 8 + words[1].length);
                        }
                    } else {
                        var words = str.split(' ');
                        if (isNaN(parseInt(words[0]))) {
                            txtbox.value = '';
                        } else {
                            txtbox.setSelectionRange(words[0].length, words[0].length);
                        }
                    }


                }
                return true;

            }
        }
<asp:TextBox ID="TermTextBox" runat="server" Text='<%# Bind("Term") %>' onKeyPress="return timeFrame(event, this, false);" onKeyUp="timeFrame(event, this, false);" onblur="timeFrame(event, this, false);"  MaxLength="25" Width="200px" />

【问题讨论】:

  • JavaScript 控制台中是否有任何错误?顺便说一句,这是 jQuery 之类的库存在的原因之一 - 浏览器从未与 JavaScript 兼容。
  • 不,VS 没有显示任何错误,就像我说的,它在 FF 中有效,所以使用 firebug 也不会显示任何问题:/
  • IE9/10 控制台本身的错误怎么办?可能有其他因素(例如 IE 兼容模式或其他 JavaScript 代码)导致在 IE 中运行的已部署页面表现不同。
  • 它在is supportedIE9+。页面是否以兼容模式呈现?按F12 启动IE 控制台并查看“浏览器模式”和“文档模式”。除了 IE9 和 IE9(对于 IE9 浏览器)以外的任何东西都可能是它无法正常工作的原因。

标签: javascript asp.net internet-explorer visual-studio-2012


【解决方案1】:

在 andyb 说完之后,我研究了为什么 setSelectionRange 失败了……原来在 IE 中,有兼容模式和文档模式……当我们的兼容模式运行 ie9 时,文档模式默认为 id7 标准。所以我在 asp 文档的头部添加了以下元标记...

    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />

...现在 IE 识别了该命令,一切正常。

【讨论】:

  • 太棒了!我以为会是这样的。如果你愿意,你可以“接受”你自己的答案:)
【解决方案2】:

这只是一个猜测,但我认为您可以尝试检查部署的源代码是否您的 javascript 代码没有被缩小。您的 timeFrame 方法可以缩短为 xy 之类的东西,但您的 onKeyUp 方法仍然包含非缩短名称 timeFrame em>。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2013-09-11
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多