【问题标题】:JS: get value of element in ajax updated divJS:在ajax更新的div中获取元素的值
【发布时间】:2016-08-22 20:00:13
【问题描述】:

我有一个页面,其中包含根据需要使用 Ajax 请求更新的 div;这个 div 包含一个动态名称的输入,我需要从中获取数据。需要此数据的按钮和脚本放置在主页上。当我尝试使用放置在更新的 div html 本身中的脚本获取数据时,它工作正常;但放在主页上的相同代码不起作用。如何在 Ajax 更新的 div 中按 id 查找元素?

主页:

/* ajax updated div */
<span id="i_descr_{{i.id}}" class="tooltiptext"></span>
/* button */
<div class="trade_move arrow_r" item_id="{{i.id}}" partner_id="{{data.partner_id}}"></div>
<script>
$(".trade_move").click(function() {
            var item_id = $(this).attr("item_id");
            var partner_id = $(this).attr("partner_id");
            var quantity = 1;
            var sliderElem = document.getElementById("slider_".concat($(this).attr("item_id")));
            if (sliderElem) {
                quantity = sliderElem.value;
            }
}
</script>

Ajax 模板,输入部分:

<input class="slider" type="range" item_id="{{description.id}}" id="slider_{{description.id}}" min="0" max="{{description.slider}}" value="{{description.slider}}" step="1">

如果我将按钮和脚本放入 ajax 模板中,它们就可以正常工作;是否可以通过在 ajax 部分之前加载的主页中的 id 来处理输入?

编辑: 我尝试按照 Arathi Sreekumar 的建议将按钮按下脚本添加到更新 div 的 ajax 函数中,但它的行为与以前相同。除非您现在实际使用滑块加载 div,否则它也不起作用,这意味着它来自 ajax 函数而不是其他地方。我会弄错语法吗?

$(".item_description").hover(function(){
                 var param = $(this).attr("d_id");
                 $.get('/sud/item_na/', {id: param}, function (data) {
                     $('#i_descr_'.concat(param)).html(data);

                     $(".trade_move").click(function() {
                        var item_id = $(this).attr("item_id");
                        var quantity = 1;
                        var sliderElem = document.getElementById("slider_".concat($(this).attr("item_id")));
                        if (sliderElem) {
                            quantity = sliderElem.value;
                        }
                        $.ajax({
                             ...
                        });
                    });
         });

edit2:我得到它的工作,不完全是我最初想要的,但仍然如此。 我没有详细介绍总体布局,而是为了说明清楚: 1) 第 1 层:带有空 div 和按钮的主页 2)第 2 层:主页上的空 div 填充了由按下按钮生成的 ajax html。这个 html 是一个项目列表,每个项目都带有一个空的工具提示 div,在悬停时会触发另一个 ajax 查询并用项目信息填充它。 3) 第 3 层:项目信息窗口,其中包含滑块控件和对项目进行操作的按钮,考虑到滑块值(自然是项目 ID)。

我将按钮和附加到它的脚本放入最后一个第 3 层模板中。代码如下:

<div align="left">
        <input class="slider_value" id="slider_value_{{description.id}}" type="number" value="{{description.slider}}" disabled>
        <input class="slider" type="range" item_id="{{description.id}}" id="slider_{{description.id}}" min="0" max="{{description.slider}}" value="{{description.slider}}" step="1">
        <div class="trade_move_slider arrow_r" id="trade_move_slider_button_{{description.id}}" item_id="{{description.id}}" partner_id="{{description.partner_id}}" quantity="{{description.slider}}" style="width: 30px;height: 20px;display: inline-block;">
</div>

<script>
    $(document).ready(function() {
        $(".slider").change(function() {
            $("#slider_value_".concat($(this).attr("item_id"))).val($(this).val());
            $("#trade_move_slider_button_".concat($(this).attr("item_id"))).attr("quantity", $(this).val());
        });

        $(".trade_move_slider").click(function() {
            $('#output').html('<span class="dot"></span><span class="dot"></span><span class="dot"></span>');
            var csrftoken = getCookie('csrftoken');

            function csrfSafeMethod(method) {
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
            $.ajaxSetup({
                beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });
            var item_id = $(this).attr("item_id");
            var partner_id = $(this).attr("partner_id");
            var quantity = $(this).attr("quantity");
            $.ajax({
                 type:"POST",
                 url:"/sud/trade_action/",
                 data: {
                        'partner': "container",
                        'id': partner_id,
                        'goods_id': item_id,
                        'csrftoken': csrftoken,
                        'quantity': quantity
                        },
                 success: function(data){
                         $('#output').html(data);
                 }
            });
        });

    });
</script>

注意按钮属性“数量”如何在滑块更改时更新。由于某种原因,我无法直接使用 $('#slider_'.concat(item_id)).val();可能是我最初把我带到这里的问题。出于一般目的,我仍然想知道如何使用另一个 ajax 生成的 DOM 中的脚本来处理一个 ajax 生成的 DOM 的元素(如果我说得正确的话)。

这是在悬停时更新项目信息的代码:

$(".item_description").hover(function(){
             if ($(this).attr("data") == "empty")
             {
                 $(this).attr("data", "loaded");
                 var param;
                 var partner_id = $(this).attr("partner_id");
                 param = $(this).attr("d_id");
                 $.get('/sud/item_na/', {id: param, list_type: 'char', 'partner_id': partner_id}, function (data) {
                     $('#i_descr_'.concat(param)).html(data);
                 });
             }
         });

【问题讨论】:

  • 我相信这是因为,当主页面中的脚本运行时,dom 不存在。我建议将此代码添加到您的 ajax 的成功函数中,而不是在 div 在代码中更新并呈现到 DOM 之后。
  • 你也可以使用jQuery ajax调用的beforeSend参数
  • @Arathi Sreekumar 我试着听从你的建议,但它的行为是一样的,详细信息在主帖中更新。不过我可能语法错误,我几乎没有 js 经验。
  • 可以分享ajax代码吗?将上述模板更新为 ajax 中的 DOM 的代码,基本上整个 ajax 请求响应部分最好。
  • 数据中有什么?是贸易移动类的 div 吗?或者它是模板。如果是模板,请尝试在交易移动单击中进行控制台日志记录,在 if slideElem 之前设置 sliderElem 的值。我认为这可能是它失败的地方。让我知道它是否未定义。

标签: javascript jquery html ajax


【解决方案1】:

您可以在输入元素中添加一个伪类js-slider

<input class="slider js-slider" type="range" 
      item_id="{{description.id}}" 
      id="slider_{{description.id}}" 
      min="0" max="{{description.slider}}" 
      value="{{description.slider}}" step="1">

然后你这个类来获取你的元素。

$(".trade_move").click(function() {
    var item_id = $(this).attr("item_id");
    var partner_id = $(this).attr("partner_id");
    var quantity = 1;
    var sliderElem = $(".js-slider");
    if (sliderElem) {
        quantity = sliderElem.val();
    }
}

在上面的代码中,我认为很明显没有使用item_idpartner_id。所以你可以消除它们。此外,我看不到您在哪里使用quantity

【讨论】:

  • 我实际上有一个元素列表,每个元素都有自己的按钮和悬停激活的信息窗口,这是更新的一个 ajax。因此,您不必为所有列表元素加载所有数据,而只需为用户悬停的那些元素加载数据。该信息具有滑块输入来设置一个值,并且应该去服务器进行进一步处理。我没有包含此请求代码,因为它与问题无关。
  • 根据您的建议,我需要 item id 字段来区分列表元素,并且滑块已经具有滑块类,为什么不使用它呢?另外,这个班级有很多项目,有什么办法可以得到一个具有特定 ID 的项目?我想加载主页时元素不存在也会有同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多