【问题标题】:jQuery button on a li does not triggers change event on input before clickli上的jQuery按钮在单击之前不会触发输入的更改事件
【发布时间】:2012-03-15 02:28:56
【问题描述】:

我有一个输入字段。当 onchange 事件被触发时,我想启用一个基于 LI 元素的 jQuery 按钮。我希望具有与普通按钮相同的行为。问题是,如果我在按钮被禁用时单击它,jQuery 会捕获该事件并阻止发生默认行为,这应该释放输入字段上的焦点并在按钮上触发 onclick 之前触发 onchange 事件。

我在 Chrome 中使用 jQuery 1.6.4 和 jQuery UI 1.8.16。

在这个现场演示中:http://jsfiddle.net/francisfortier/QMDc2/5/,您拥有三个字段集。第一个使用标准按钮,第二个,基于 li 的 jQuery 按钮,第三个,再次使用基于 li 的 jQuery 按钮,使用特殊的 hack 手动释放点击捕获输入字段的焦点.这第三个字段集可以解决我在现代浏览器上的问题,但它不会在 IE8 中,因为它需要使用事件捕获。

您是否有更好的跨浏览器解决方案以使 jQuery 按钮具有与标准按钮相同的行为?

谢谢

【问题讨论】:

    标签: javascript jquery jquery-ui


    【解决方案1】:

    在您的点击处理程序之前添加.unbind('click') 怎么样:

    $('#jQueryButton').find('li').button({
        disabled: true
    }).unbind('click').click(function() {
        alert('Hello ' + $(this).closest('fieldset').children('input:first').val() + ' !');
    });
    

    演示:http://jsfiddle.net/jtbowden/yPHKp/

    当然,那么你必须将智能添加到点击处理程序中以在输入为空时不执行:

    $('#jQueryButton').find('li').button({
        disabled: true
    }).unbind('click').click(function() {
        if($('#jQueryButton').children('input').val()) {
            alert('Hello ' + $(this).closest('fieldset').children('input:first').val() + ' !');
        }
    });
    

    演示:http://jsfiddle.net/jtbowden/yPHKp/1/

    或者,您可以添加一个keyup 处理程序。然后在单击按钮之前进行更改:

    $('#jQueryButton').children('input').bind('change keyup', function() {
        var self = $(this);
    
        self.closest('fieldset').find('.ui-button').button(self.val() ? 'enable' : 'disable');
    });
    

    演示:http://jsfiddle.net/jtbowden/GcnYz/1/

    更好的解决方案可能是unbind click.button 处理程序,然后通过在输入字段中添加.blur() 事件重新绑定它:

    $('#jQueryButton').find('li').button({
        disabled: true
    }).unbind('click.button').bind('click.button', function(event) {
        $('#jQueryButton').children('input').blur();
        if ($(this).button("option", "disabled")) {
            event.preventDefault();
            event.stopImmediatePropagation();
        }
    }).click(function() {
        alert('Hello ' + $(this).closest('fieldset').children('input:first').val() + ' !');
    });
    

    这将保留您的所有验证,并强制change 事件在按钮单击之前发生。您可以将最终的 .click() 处理程序集成到 click.button 事件中,方法是将胆量放在 else 块中。

    演示:http://jsfiddle.net/jtbowden/GcnYz/2/

    【讨论】:

    • unbind 似乎确实改变了点击的行为,但现在,按钮真的被禁用了,因为文本框中没有任何内容,点击事件被触发。
    • 在这个小例子中它可以工作,但实际上,onchange 事件绑定在包含多个字段的元素上,我无法验证某些内容是否真的发生了变化。这就是为什么我希望拥有与常规按钮相同的行为。
    • 当字段实际更改时触发keyup 处理程序怎么样?请参阅上面的编辑。
    • 同样,这不是相同的行为,它不适用于通过鼠标单击或复选框单击进行的粘贴。
    • 但是您不会遇到单击复选框的问题吗?那些应该立即触发change。我只是在尝试寻找可能的解决方案。我理解你的问题,但让 IE8 玩起来并不容易。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多