【问题标题】:JQuery: How to select specific element of a class by data-, then use as target?JQuery:如何通过数据选择类的特定元素,然后用作目标?
【发布时间】:2013-10-07 05:16:00
【问题描述】:

我已经修改了本教程中的代码(http://gazpo.com/2011/09/contenteditable/ 演示:http://gazpo.com/downloads/tutorials/html5/contentEditable/),它将显示来自数据库的多个 contenteditable div 的 div,并通过 AJAX 保存修改后的更改。

这是 PHP 生成的内容:http://jsfiddle.net/fmdx/78rWQ/

    <div data-id="0" class="wrap"><!-- Content Wrapper -->
      <div data-id="0" class="status"></div>
    <div data-id="0" class="content">
    <p data-id="0" style="padding-left:7px;">
            <span data-id="0" style="padding-right:10px;">a)</span>
            <span data-id="0" data-primary="1" data-comcounted="0" data-showcom="1" data-fileno="CTTEST" data-part="1" class="editable" contenteditable="true">Compliance with the terms and conditions of the Clearwater Ordinance as currently set forth by the City of Sheboygan.</span></p>
        </div>
      <button data-id="0" class="save">Save</button>      
    </div>

乘以该表中的行数。

这里是 Jquery/Ajax: $(document).ready(function() {

    $(".save").click(function (e) {     
        //how do I narrow down these variables to that specific grouping being selected?
        var text = $('.editable').html();
        var primary_key = $('.editable').attr('data-primary');
        var showcom = $('.editable').attr('data-showcom');
        var comcounted = $('.editable').attr('data-comcounted');
        var part = $('.editable').attr('data-part');
        var fileno = $('.editable').attr('data-fileno');

        $.ajax({
            url: 'save.php',
            type: 'POST',
            data: {
            text: text,
            primary_key: primary_key,
            showcom: showcom,
            comcounted: comcounted,
            part: part,
            fileno: fileno              
            },              
            success:function (data) {

                if (data == '1')
                {
                    $(".status")
                    .addClass("success")
                    .html("Data saved successfully")
                    .fadeIn('fast')
                    .delay(3000)
                    .fadeOut('slow');   
                }
                else
                {
                    $(".status")
                    .addClass("error")
                    .html("An error occured, the data could not be saved")
                    .fadeIn('fast')
                    .delay(3000)
                    .fadeOut('slow');   
                }
            }
        });   
    });

    $(".editable").click(function (e) {
        $(".save").show();
        e.stopPropagation();
    });

    $(document).click(function() {
        $(".save").hide();  
    });
});

这个乘以从数据库返回的行数。

选择一个div时,出现每个保存按钮,当保存数据时,它会显示每个div的状态栏。

我要做的是获取所选范围的 data-id 属性,以便它对于包装器、状态、contentedibable 部分和该保存栏是唯一的。在某种程度上,它是作为整个包装段的id。我会如何更改jQuery / ajax,以便选择何时选择ContentEditabit div时,只有特定的div将被修改,弹出保存按钮它,并显示该状态栏(而不是每个都显示)?

【问题讨论】:

  • 下面的回答对你有帮助吗
  • 我正在输入代码,但保存时没有显示状态栏(错误或成功)。查看数据库,我也没有看到更改,所以我正在检查 ajax 以确保我没有尝试将其保存到一块 lint 中。但似乎你让我指出了正确的轨道,只是想解决问题。

标签: jquery ajax html contenteditable


【解决方案1】:

您需要使您的选择器特定于当前正在运行的元素。

$('.save').show(); 变为 $(this).closest('.content').next(".save").show() $('.editable').html(); 变为 $this.prev('.content').find('.editable') $('.status') 变为 $this.closest('.wrap').find(".status")

JS:

$(".editable").click(function (e) {
    $(this).closest('.content').next(".save").show(); //<-- select the specific one
    e.stopPropagation();
});


 $(".save").click(function (e) {
        var $this = $(this),
            $editable = $this.prev('.content').find('.editable'),
            text = $editable.html(),
            primary_key = $editable.data('primary'),
            showcom = $editable.data('showcom'),
            comcounted = $editable.data('comcounted'),
            part = $editable.data('part'),
            fileno = $editable.data('fileno');

        $.ajax({
            url: '/echo/json',
            type: 'POST',
            data: {
                text: text,
                primary_key: primary_key,
                showcom: showcom,
                comcounted: comcounted,
                part: part,
                fileno: fileno
            },
            success: function (data) {
                var mg = "An error occured, the data could not be saved";
                if (data == '1') {
                    mg = "Data saved successfully";
            }
            $this.closest('.wrap').find(".status")
                .addClass("success")
                .html(mg)
                .fadeIn('fast')
                .delay(3000)
                .fadeOut('slow');
        }
        });
    });

Fiddle

【讨论】:

  • 谢谢!我不得不将 echo/json 更改为指向 save.php 和瞧,它工作得很好(这解释了为什么无论成功或失败它都不会显示状态栏)。
  • @fmdx 哦,是的,我已经把它放在 fiddler 中进行测试了。
  • 出现错误时如何修改状态栏?在原始教程中,他们有代码,但是由于您修改了 if 语句,我似乎无法使其正常工作(在 CSS 中,有一个类可以在发生错误时使状态栏的背景变为红色,目前无论消息如何,状态栏都是绿色的,这对用户来说有点视觉错误)
  • @fm 哦,我注意到您可以像消息一样设置课程。像这样jsfiddle.net/Rx7gL
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2018-12-03
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2011-11-16
相关资源
最近更新 更多