【问题标题】:Input type text and onKeyDown not working under IE输入类型文本和 onKeyDown 在 IE 下不起作用
【发布时间】:2011-02-04 09:25:35
【问题描述】:

我正在编写一个 WWW 应用程序,它必须在 IE 下运行。我在 Firefox 下运行的代码有问题,但我无法让它在 IE 下运行。

// JS代码

function test()
{
    if (window.event.keyCode == 13)
        window.location.assign("myPage.php");
}

我在window.locationlocation.href 以及document.location 周围尝试了一些类似的方法。我已经读到 IE 有这个问题,所以我寻求解决方案。

目标是,在<input type='text' name='item_code' onKeyDown='test()'> 中输入一些文本并单击enter 后,该页面会重新加载。所以结果类似于在文本输入下方按下提交类型按钮。

在 IE 中它会重新加载相同的页面,但没有任何反应。在 Firefox 中它可以正常工作。

更新 1:

bobince 给出的尝试解决方案。

<input type='text' name='item_code'>

<script type='text/javascript' >
 
document.getElementsByName('item_code')[0].onkeydown = function(event)
{
    if (event == undefined) { event = window.event; }
    if (event.keyCode == 13) { window.location = 'myPage.php'; }
        
    alert('1');
}
    
</script>";

问题是,如果有alert('1'); 行,页面会显示警报并重定向,如果没有alert('1'); 行,页面只会重新加载到自身。不知道这里有什么问题?

更新 2:

我正在粘贴最终对我有用的内容。

<form action='mainPage.php' method='POST'>
    <input type='text' name='item_code'>
</form>

<script type='text/javascript' >
    document.getElementsByName('item_code')[0].onkeydown= function(event)
    {
        if (event == undefined)
        {    
            event = window.event;
        }

        if (event.keyCode == 13)
        {
            var js_item_code = document.getElementsByName('item_code')[0].value;
            window.location = 'myPage.php?item_code='+js_item_code;
            return false;
        }
    };
</script>

【问题讨论】:

  • window.location.href = "myPage.php";怎么样
  • window.location.href 没有assign 方法(window.location 有)。但是,我认为这不是您的问题,因为在 Firefox 中也是如此(并且会引发错误)。您的代码中还有其他一些错别字(我已修复,但您在 :-) 中重新编辑了它们)
  • 哦,不知道,如果可以,请再次编辑,感谢您的意见

标签: javascript html dom-events dhtml


【解决方案1】:

试试这个。它之前对我有用。

 <input type="text" onKeyPress="KeyCheck"/>

 function KeyCheck(e) {
    var KeyID = (window.event) ? event.keyCode : e.keyCode;
    if (KeyID == 13 ) {
       alert('key pressed!!);
    }
  }

【讨论】:

  • 这行不通。 onKeyPress 现在是一个引用 KeyCheck 函数的函数,然后什么也不做。 KeyCheck 永远不会被调用。
【解决方案2】:

它应该可以正常工作。您可能遇到的两个潜在问题:

  1. 众所周知,IE 在 location.href 中使用相对链接时会做一些奇怪的事情。你试过在里面放http://stackoverflow.com之类的东西吗?
  2. 如果您在本地文件而不是 Web 服务器上进行测试,IE 中的安全设置可能会阻止正确的事情发生。

【讨论】:

    【解决方案3】:

    这很奇怪,因为您使用window.event 应该确保您的函数only 可以在 IE 中运行。当我尝试您的代码时,这肯定会发生在我身上。我怀疑你没有向我们展示更多内容。

    使用内联事件处理程序属性以跨浏览器方式处理事件的常用方法是:

    <input type="text" name="item_code" onkeydown="test(event)">
    
    function test(event) {
        if (event.keyCode===13)
            window.location.href= 'myPage.php';
    }
    

    之所以有效,是因为属性中的event 指的是IE 中的全局window.event,而在其他所有浏览器中,它指的是传递给事件处理程序属性函数的名为event 的本地参数。

    但是,通常认为最好避免事件处理程序属性并从 JavaScript 本身分配处理程序。在这种情况下,您需要检查一下使用哪个:

    <input type="text" name="item_code">
    
    // in a script block after the input, or in document-ready code
    //
    document.getElementsByName('item_code')[0].onkeydown= function(event) {
        if (event===undefined) event= window.event; // fix IE
        if (event.keyCode===13)
            window.location.href= 'myPage.php';
    };
    

    一般来说,我只会尝试捕获 Enter 按键以重现/更改默认表单提交行为作为最后的手段;如果可以让表单提交到您希望它去的地方,那就更好了。

    【讨论】:

    • 好的。尝试了您的解决方案,它似乎有效。不过有一个微妙的问题。它仅在alert('sth'); 在第二个 if 块之后才有效:页面显示警报并重定向。如果我删除此警告行,页面会重新加载到自身..
    • 如果您在实际的&lt;form&gt; 元素中,则需要将return false 添加到事件处理程序中,否则表单将继续正常提交以按Enter 按钮,并结束在表单的 action 属性处(如果省略,则默认为当前 URL,尽管省略它是无效的)。如果您有一个表单并且您想在其上捕获提交(通过 Enter 或任何其他方式),最好使用 onsubmit 事件,而不是担心重新创建特定于浏览器的键处理行为。
    • 当然,最好让表单在没有任何 JavaScript 黑客攻击的情况下简单地工作。如果由于某种原因无法做到这一点,最好省略 &lt;form&gt; 并仅包含裸露的 &lt;input&gt; 元素,这样就不会出现不必要的提交。
    • 我在编译语言方面更有经验。我将欣赏更具描述性的答案。现在我明白为什么它会这样工作。不知道 a) 哪个是事件处理程序(添加返回 false)? b) 我应该在哪里使用 onsubmit 事件?
    • onsubmit&lt;form&gt; 上。您可以从提交处理程序return false 停止提交表单。 [您还可以在提交按钮的onclick 处理程序上return false 停止导致表单提交的单击。您还可以在输入的onkeypress 处理程序上return false 停止导致表单提交的 Enter 按键。您还可以在输入的onkeydown 处理程序上使用return false 来停止导致keypress 的keydown,这反过来也会停止提交表单!但是阻止onsubmit 是最可靠的,因为它可以捕获所有情况。]
    【解决方案4】:

    jQuery 修复

    document.onkeydown = function (e) {
        var event = jQuery.event.fix(e || window.event);
        var keycode = event.which;
        var isControl = event.ctrlKey;
    }
    

    【讨论】:

      【解决方案5】:

      有一种方法可以在不使用 html 代码上的 &lt;form&gt; 标记的情况下使其工作。

      这是我发现的最简单的解决方案,至少适用于 IE、Chrome 和 Firefox:

      $(function() {
        $("input#q").on('keydown', function(event) {
          if (event.which == 13) {
            document.location.assign("page.aspx?q=" + $("#q").val());
            return false;
          }
        });
      });
      &lt;input name="q" type="text" /&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多