【问题标题】:jQuery textchanged bind occurs on irrelevant keypressesjQuery textchanged 绑定发生在不相关的按键上
【发布时间】:2012-05-31 11:05:22
【问题描述】:

这是我的代码:

var tourl;
$(document).ready(function(){
    $("input#url").bind("textchange",showPage);
    $("input#url").bind("textchange",toggleButtons);
    $("input#url").focus();


    $("form#surlform").submit(function(){
        var url = $("input#url").val(); 
        $.get("api/create.php?a=&url=" + url, function(data) {
                $("input#url").val(data);
                $("input#url").select();
                $('#button').hide();
                $('#hbutton').show();
                tourl = data;
                $('#hbutton').bind('click', function() {
                    window.location = tourl + "-";
                });
            });

        return false;
    });
    });

$(document).click(function(){
    showPage();
});
$(document).mousemove(function(){
    showPage();
});
function toggleButtons() {
    $('#hbutton').hide();
    $('#button').show();
}

如您所见,数据被输入到表单中,jQuery 停止正常的表单提交,而是联系 API。在来自 API 的响应中,它将文本框文本更改为响应并突出显示它。然后它将提交按钮更改为链接到 API 输出的按钮(它是一个 URL)。我正在使用绑定到 textchange 事件,然后在更改表单字段中的文本时将按钮更改回来。

但是,它不会在字段中的文本实际更改时触发,而是在任何按键时触发。例如,如果我想复制输出,我会使用 Ctrl+C 来执行此操作,但是当我这样做时,它会将其计为正在更改的文本并将按钮更改回来。

有什么方法可以让这个在框内的文本实际改变时触发?

提前致谢。

【问题讨论】:

  • 为什么不使用事件change 而不是textchange?通过使用change,文本框必须在引发change 事件之前失去焦点。

标签: php jquery api text


【解决方案1】:

我会使用change 事件而不是使用textchange 事件(并且不明白为什么使用bind...):

$(document).ready(function(){
    $("input#url").change(function(){
        showPage();
        toggleButtons();
    });
    $("input#url").focus();
    ...
});

【讨论】:

  • 谢谢,但是当使用表单时,由于 API 结果在此处突出显示,用户只需开始输入或粘贴内容即可。在实际单击文本框之前,他们不会关注文本框按钮,所以它需要在此之前更改回来。我真的希望它在文本框中的数据发生变化时触发。
【解决方案2】:

将最后的文本保存到 var 中并与实际文本进行比较,如下所示:

var lastText = jQuery('parentElement element').val();
jQuery('parentElement').on('keyup', 'element', function() {
    if(jQuery(this).val() !== lastText) {
        // do what do you want
    }

    lastText = jQuery(this).val();
});

Demo

【讨论】:

  • 好概念,但 Ctrl + C 仍然触发它 - 很奇怪,因为它没有以任何方式更改文本,但我已经用你的代码尝试了你的演示和我的页面,并且都错误地触发了Ctrl + C。
  • @HenryCole 不是按 ctrl + c 触发的,问题是默认值,现在检查更新的演示,你会看到。
  • 但这里面没有任何内容。看看jsfiddle.net/2fMWh/1 - 如果您突出显示文本并按Ctrl + C,则会弹出警报。我的实现也是如此,使用 jQuery 自动突出显示文本。我所做的就是按 Ctrl + C 并触发。
  • @HenryCole 这只是第一次发生,因为 lastText 初始值为 '' 而 textarea 初始值为 'sample',所以您也必须更改 lastText 初始值。 jsfiddle.net/2fMWh/3
  • 啊完美!非常感谢您的时间和帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多