【问题标题】:Wait until user click a span then trigger AJAX request等到用户点击一个 span 然后触发 AJAX 请求
【发布时间】:2019-05-22 12:48:03
【问题描述】:

目前,当用户在输入字段中更改某些内容并单击“检查”图标时,我正在使用简单的 AJAX 放置请求。下面的代码不会将图标从“编辑”更改为“检查”,但是当我使用 AJAX 请求删除一行 $.when($(icon).trigger("click")).then(function(){ 时,图标会更改。

我非常感谢任何有关相应 jquery 指令的帮助

$(document).ready(function() {
    $('.clickable-edit-icon').click(function(e){
        e.preventDefault();

        var delete_id = $(this).closest('tr').data('contact-id');
        var icon = $(this).children();
        var input = $(this).parent().children('input');
        var input_text = $(input).text();

        if (icon.text() == "edit") {
            $(input).prop('disabled', false);
            $(icon).text("check");
            $.when($(icon).trigger("click")).then(function(){
                $.ajax({
                    url: 'edit/'+delete_id+'/',
                    method: 'PUT',
                    data: {},
                    contentType:'application/json',
                    error: function(result){},
                    success: function(result) {}
                });
            });
        }else{
            $(input).prop('disabled', true);
            $(icon).text("edit");
        }
    });
});

HTML 结构

<tr>
   <td id="contact-first-name">
      <input value="{{ contact.first_name }}" disabled>
          <span class='clickable-edit-icon'>
              <i class='tiny material-icons'>edit</i>
          </span>
   </td>
</tr>

如果您想知道为什么我写了var input = $(this).parent().children('input'); 而不是var input = $(this).parent('input');,原因是第二种情况下的输入未定义。

【问题讨论】:

  • 这里不太清楚你在问什么。也许 MCVE 会更清楚。另请注意,将trigger() 放入$.when() 处理程序是多余的,因为它不是异步进程。此外,您还双重包装了几个 jQuery 对象。
  • @Rory McCrossan 你必须知道,现在我正在学习 jQuery 并且有很多东西我必须学习 :)。将需要 Input 和 input_text 变量来验证后续代码中的旧字符串和新字符串。现在我要求只有在用户处于编辑模式并单击“检查”图标时才能启动 AJAX 功能。
  • If you wondering why I wrote ....不,我们不会奇怪,因为这两个语句不等价。第一个寻找共享同一父母的不同孩子。第二个寻找父母本身。如果您愿意,您可以使用siblings() 来完成这项工作。
  • 如果你解决了它,你应该把它写成答案,而不是评论。允许和鼓励回答您自己的问题:-)
  • 啊...这是因为您将类添加到现有元素。 jQuery 检测到这一点,并且由于您已经单击了该元素,因此假设您想要执行委托处理程序。总体而言,更好的方法可能是根据需要显示和隐藏两个元素,而不是更改现有元素的用途。演示:jsfiddle.net/hre9ptgf

标签: jquery django materialize


【解决方案1】:

主要感谢@ADyson,问题已得到解决。我必须处理的下一步是 Django 中的 400(错误请求)PUT 方法,但是是的.. 这是一个不同的故事。现在 AJAX 仅在单击“检查”图标/跨度时执行,这是解决方案的目标。

JS 文件

$(document).ready(function(){

    $(".clickable-edit-icon").on('click',function(e){
        e.preventDefault();

        var span = $(this);
        var icon = $(this).children();
        var input = span.siblings('input');

        input.prop('disabled', false);
        span.siblings(".clickable-check-icon").show();
        span.hide();
    });

     $('.clickable-check-icon').on('click',function(e){
        e.preventDefault();

        var span = $(this);
        var icon = $(this).children();
        var input = span.siblings('input');
        var edit_id = span.closest('tr').data('contact-id');

        input.prop('disabled', true);
        span.siblings(".clickable-edit-icon").show();
        span.hide();

        $.ajax({
            url: 'edit/'+edit_id+'/',
            method: 'PUT',
            data: {},
            contentType:'application/json',
            dataType: 'json',
            error: function(result){},
            success: function(result) {
                $(icon).text("edit");
                $(input).prop('disabled', true);
            }
        });

    });
});

HTML 结构

<tr>
   <td id="contact-first-name">
      <input value="{{ contact.first_name }}" disabled>
          <span class='clickable-edit-icon'>
              <i class='tiny material-icons'>edit</i>
          </span>
          <span class='clickable-check-icon' style="display:none;">
              <i class='tiny material-icons'>check</i>
          </span>
   </td>
</tr>

【讨论】:

    【解决方案2】:

    没有看到html结构,我简单说一下:

    <div class='item'>
      <input tyle="text" />
      <span class="clickable-edit-icon editing">check</span>
    </div>
    
    $(document).ready(function() {
      $('.clickable-edit-icon').on('click',function(e){
            e.preventDefault();
    
            var delete_id = $(this).closest('tr').data('contact-id');
            var icon = $(this);
            var input = $(this).parent().children('input');
            var input_text = $(input).text();
            if (icon.text() == "edit") {
                $(input).prop('disabled', false);
                $(icon).text("check");
                $.when(icon.trigger("click")).then(function(){
                  $.ajax({
                        url: 'edit/'+delete_id+'/',
                        method: 'PUT',
                        data: {},
                        contentType:'application/json',
                        error: function(result){},
                        success: function(result) {}
                    });
                });
            }else{
                $(input).prop('disabled', true);
                $(icon).text("edit");
            }
        });
    };
    

    希望对思考有所帮助。

    【讨论】:

    • 我认为您的理解是错误的 - 请参阅标题。 OP 想等到单击跨度,然后运行 ​​AJAX。您正在运行 AJAX,然后单击跨度。此外,对于您正在做的事情, $.when 似乎是不必要的。
    • 我已经用 html 示例对其进行了更改,并且它可以正常工作,因为我已经了解了他的需求
    • 不完全是@Will。 span 标签&lt;i class='tiny material-icons'&gt;edit&lt;/i&gt; 中有一个子元素。我编辑了我以前的帖子,包括一个 HTML 结构。您放置的代码无法正常工作,因为单击跨度后图标没有改变并且输入仍然被禁用
    • $.when(icon.trigger("click")).then(function(){ 在这里仍然是一派胡言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2017-11-18
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多