1

jQuery 焦点似乎导致 Internet Explorer 9 执行两次。这个问题在旧版本的 IE 中不会发生,在 Firefox 或 Chrome 中也不会发生。

我让用户在输入字段中输入代码。在输入或提交时,代码通过负载发送到另一个脚本(ajax)。输入字段中的代码被删除,焦点被带回。

该脚本的结果被插入到同一页面上的一个 div 中。

    $(document).ready(function(){
        $('#code').keyup(function(e){
            if(e.keyCode == 13){
                console.log('Code submitted through enter');
                sendcode($('#code').val());
            }
        });

        function sendcode(b){
            console.log('function sendcode used');
            $('#Result').load('scan.php?code=' + b);
            $('#code').val('');
            $('#code').focus();
        };

        $('#Submit').click(function(){
            console.log('Code submitted through click');
            sendcode($('#code').val());
        });
    });

但是, focus() 似乎是问题所在,因为当我删除它时,问题就消失了。我尝试将 focus() 放在代码的任何位置,但没有成功。是否有任何替代 focus() 的方法可以实现相同的效果,或者可以以某种方式修复?

NETWORK:

URL: /scan.php?code=stackoverflow
URL: /scan.php?code=

CONSOLE: (when hit enter)
Log: Code submitted through click 
Log: function sendcode used 
Log: Code submitted through enter 
Log: function sendcode used 

您可以看到第二个负载也没有携带代码变量。

4

4 回答 4

2

Submit将按钮更改为spanordiv并设置样式。

<span id="Submit">Submit</span>

演示:小提琴

您还可以查看这个答案type="button",其中建议向按钮元素添加属性。

于 2013-02-07T09:32:55.523 回答
2
    function sendcode(b){
        if(b){
            console.log('function sendcode used');
            $('#Result').load('scan.php?code=' + b);
            $('#code').val('');
            $('#code').focus();
        }
    };

沿着这些思路的东西应该起作用。也许如果b != undefined或类似的东西。只要确保B在那里。

于 2013-02-07T09:33:17.917 回答
1

把函数放在外面doc ready,试试这个:

function sendcode(b){
  $('#Result').load('scan.php?code=' + b);
  $('#code').val('');
  $('#code').focus();
}

$(document).ready(function(){
    $('#code').keyup(function(e){
        if(e.keyCode == 13){
            sendcode($('#code').val());
        }
    });

    $('#Submit').click(function(){
        sendcode($('#code').val());
    });
});

或试试这个:

.load()是 jquery 的ajax方法之一,因此您必须停止提交表单,否则页面会刷新。

$('#Submit').click(function(e){
    e.preventDefault();
    sendcode($('#code').val());
});
于 2013-02-07T09:17:54.080 回答
0

不要拦截击键,除非你真的,真的是认真的。当然不要用 span 模拟按钮!HTML 有标签是spandiv原因的。

您的问题可以说是一个 IE 错误,但这是您使用内置行为解决问题的结果,效果很好。您只需要一个在提交表单时触发的事件处理程序。

$(document).ready(function(){
    function sendcode(b){
        console.log('function sendcode used');
        $('#Result').load('scan.php?code=' + b);
        $('#code').val('');
        $('#code').focus();
    };

    $('#form').submit(function(e) {
        e.preventDefault();
        sendcode($('#code').val());

    });
});

然后,坦率地说,您可以拥有一个不依赖于 JavaScript 的更易于访问的表单,以及更可重用的代码:

$(document).ready(function(){
    $('#form').submit(function(e) {
        e.preventDefault();

        var $form = $(this);
        var data = $form.serialize();
        var action = $form.attr('action');
        $('#result').load(action + '?' + data);

        $('#code').val('').focus();
    });
});

现在 URL 存在于表单的action属性上(这是表单的目标 URL 所在的位置),并且 JS 将像浏览器一样捆绑表单值并为您提交表单。如果用户禁用了 JS,表单将正常提交并且他们仍然会得到有用的结果,尽管是在一个新页面中。代码更短,为您处理 URL 转义问题,并且硬编码值更少。

于 2013-02-09T06:20:19.597 回答