【问题标题】:JQuery - Toggle between html values using on methodJQuery - 使用 on 方法在 html 值之间切换
【发布时间】:2014-04-28 06:44:45
【问题描述】:

这段代码的重点是在 div 内的两个版本的 innerHTML 之间来回切换,使用输入值(或默认值)并切换按钮的显示方式。它不工作。第一次点击后,“新建”按钮失效。该 div 应该恢复到具有空白输入字段的原始显示。

我已经查看了有关 .toggle 方法的其他一些问题,但它已被弃用,目前还不清楚最好的解决方法是什么。在方法上似乎没有太多共识。以下是我找到的其他线程供参考:

Here is a jsfiddle example 我正在尝试做的事情。

HTML 代码:

<div id="case-name">Case Name:&nbsp;In the Matter of <input id="input-petitioner" type="text" placeholder="Petitioner" maxlength="50"></input> and <input id="input-respondent" type="text" placeholder="Respondent" maxlength="50">&nbsp;<button id="case-name-submit" type="button" value="none">Submit</button></div>

脚本:

$(document).ready(function(){
//EVENT TRIGGERS AND ACTIONS
$('#case-name-submit').on('click', function(){
    $('#case-name').fadeOut('fast').html(
    'Case Name:&nbsp;In the Matter of ' + $('#input-petitioner').val() + ' and ' +  $('#input-respondent').val() + '&nbsp;<button id="case-name-change" type="button" value="none">Change</button>'
    ).fadeIn('fast');
});
$('#case-name-change').on('click', function(){
    $('#case-name').fadeOut('fast').html(
    'Case Name:&nbsp;In the Matter of <input id="input-petitioner" type="text" placeholder="Petitioner" maxlength="50"></input> and <input id="input-respondent" type="text" placeholder="Respondent" maxlength="50">&nbsp;<button id="case-name-submit" type="button" value="none">Submit</button>'
    ).fadeIn('fast');
});
});

【问题讨论】:

  • 你需要看看[事件委托](learn.jquery.com/events/event-delegation/)
  • 非常酷的参考。我一定会去看看的。

标签: javascript jquery html


【解决方案1】:

由于你的#case-name-submit#case-name-change已经被动态添加到DOM中了,所以这两个元素不能使用所有的事件,所以这里需要使用event delegation来附加点击这些按钮的事件:

事件委托允许我们将单个事件侦听器附加到 父元素,将为匹配选择器的所有子元素触发, 这些孩子是现在存在还是将来添加。

$(document).ready(function(){
//EVENT TRIGGERS AND ACTIONS
$('#case-name').on('click', '#case-name-submit', function(){
        $('#case-name').fadeOut('fast').html(
        'Case Name:&nbsp;In the Matter of ' + $('#input-petitioner').val() + ' and ' + $('#input-respondent').val() + '&nbsp;<button id="case-name-change" type="button" value="none">Change</button>'
        ).fadeIn('fast');
    });
$('#case-name').on('click','#case-name-change', function(){
        $('#case-name').fadeOut('fast').html(
        'Case Name:&nbsp;In the Matter of <input id="input-petitioner" type="text" placeholder="Petitioner" maxlength="50"></input> and <input id="input-respondent" type="text" placeholder="Respondent" maxlength="50">&nbsp;<button id="case-name-submit" type="button" value="none">Submit</button>'
        ).fadeIn('fast');
    });
});

【讨论】:

  • 这正是我想要做的。并感谢您的解释。如果我理解正确,我做错的一件事就是不包括父元素和子元素。由于事件委托适用于孩子,即使它们“现在存在或将来添加”,没有任何孩子有效地否定了事件处理。例如,$('#myID').on('click', function()... 没有任何子级,只有父级#myID。这样对吗?
  • 不,是否包含父元素和子元素都没有关系。这里的重要性是页面加载时您的元素在 DOM 中不存在(实际上它在您单击按钮提交时第一次工作,因为提交按钮已添加到 DOM)。但是从第二次更改 HTML 开始,新添加的 HTML 元素将无法接收点击、悬停等任何事件,因此事件委托将帮助您解决此问题。
【解决方案2】:

您正在使用动态元素,因为您正在更改内容,因此请使用事件委托

$(document).ready(function () {
    //EVENT TRIGGERS AND ACTIONS
    $('#case-name').on('click', '#case-name-submit', function () {
        $('#case-name').fadeOut('fast', function () {
            $(this).html(
                'Case Name:&nbsp;In the Matter of ' + $('#input-petitioner').val() + ' and ' + $('#input-respondent').val() + '&nbsp;<button id="case-name-change" type="button" value="none">Change</button>').fadeIn('fast')
        });
    }).on('click', '#case-name-change', function () {
        $('#case-name').fadeOut('fast', function () {
            $(this).html(
                'Case Name:&nbsp;In the Matter of <input id="input-petitioner" type="text" placeholder="Petitioner" maxlength="50"></input> and <input id="input-respondent" type="text" placeholder="Respondent" maxlength="50">&nbsp;<button id="case-name-submit" type="button" value="none">Submit</button>').fadeIn('fast')
        });
    });
});

您还需要更新 fadeOut 完整处理程序中的 html

演示:Fiddle

An updated version

【讨论】:

  • 这个解决方案真的很聪明。我不会想到将两个“on”事件链接到同一个选择器。在这个解决方案和上面的 Felix 的解决方案之间,它主要只是一种风格上的差异(例如,他使用了两个选择器,而这个选择器使用了一个)。解决方案中还有其他实质性不同吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多