【问题标题】:jQuery adding CSS class to dynamically created elementsjQuery将CSS类添加到动态创建的元素
【发布时间】:2014-10-17 10:23:26
【问题描述】:

我知道以前有人问过这个问题,但我在这里有一些严重的奇怪行为...... 我有一个 DIV,其中包含一个锚点列表,这些锚点是通过 ajax 从 php 文件(mysqli)中提取的。我可以动态添加、编辑和删除此列表中的项目(类别)。这工作正常。它看起来像这样:

但是,在创建类别后,我想自动选择它。编辑类别也是如此。 并且,页面首次加载后,默认选择“Alle”类别。

我有一个外部 categories-management.js 文件,其中包含这些功能:

function selectRootCategory () {
  selectedcategoryname = "Alle";
  categegorySelected = 0;
  $("#training_management_categories_items>ul>li>a").removeClass('categories_selected');
  $('#training_management_categories_list_a_all').addClass('categories_selected');
}
function selectEditedCategory() {
  categorySelected = 1;
  categoryid = 'training_management_categories_list_a_' + selectedcategoryid.toString();
  $("#training_management_categories_items>ul>li>a").removeClass('categories_selected');
  $('#'+categoryid).addClass('categories_selected');
}

在主页上我调用了这个函数:

$(document).ready(function() {
    GetCategories();
    CheckIfCategoryChecked();
    selectRootCategory();
});

所以基本上,页面第一次加载时应该发生什么,应该选择“Alle”类别。但这不起作用。 我想我的函数错了,但是如果我删除一个项目,selectRootCategory()-函数也会被调用,然后它就可以工作了。这是它工作的函数(住房分类-management.js,也是):

function submitDeleteCategory() {
  var url = './ajax/training_management_data.php';
  $('#delete_category_dialog_error').hide();
  $.ajax({
    url: url,
    type: "POST",
    data: {
      action: 'delete_category',
      category_id: selectedcategoryid,
    },
    dataType: 'JSON',
    success: function (data) {
      if (data == 'success') {
        GetCategories();
        CheckIfCategoryChecked();
        selectRootCategory(); //THIS WORKS
        categorySelected = 0;

        $('#delete_category_dialog').dialog('close');
      }
      else {
        $('#delete_category_dialog_error').html('<b>Fehler:</b><br>Fehler beim Löschen der Kategorie.')
        $('#delete_category_dialog_error').show( "blind" ,300);
      }
    }
  });
}

但是,selectEditedCategory()-函数永远不会起作用(在您编辑或创建类别后调用它,因此它被选中)尽管给定变量 (categoryid) 是正确的,并通过警报测试。调用selectEditedCategory的函数也放在category-management.js中。

所以我的问题是:

  1. 为什么selectRootCategory() 在通过删除对话框中的成功函数调用时可以工作,而在通过$document.ready() 调用时却不行?
  2. 为什么selectEditedCategory() 根本不起作用?

顺便说一句,不要被categegorySelected 变量所迷惑,这是为了确定是否启用了编辑和删除按钮。 “Alle”是一个虚假类别,包含所有类别的所有项目,不能删除或编辑(“Alle”在德语中是“全部”的意思)。 我正在使用 jquery-1.10.2。

编辑:为了让事情更清楚:当我调用 GetCategories(); 时,项目上的 id 设置正确。此函数执行以下操作:

function GetCategories()
{
  var url = './ajax/training_management_data.php';
  $('#training_management_categories_items').html('<ul style="list-style: none; margin-left:0px; margin-top:0px; padding:0px;" id="training_management_categories_items_ul"></ul>');
  $('#training_management_categories_items_ul').append(' \
    <li class="training_management_categories_list"> \
      <a href="" class="training_management_categories_list_a" id="training_management_categories_list_a_all">Alle</a> \
    </li> \
  ');
  $.ajax({
    url: url,
    type: "POST",
    data: {
      action: 'get_categories',
    },
    dataType: 'JSON',
    success: function (data) {
      $.each(data, function(index, data) {
        $('#training_management_categories_items_ul').append(' \
          <li class="training_management_categories_list"> \
            <a href="" class="training_management_categories_list_a" data-id="'+data.id+'" id="training_management_categories_list_a_'+data.id+'">'+data.name+'</a> \
          </li> \
        ');     
      });
    }
  });
}

它工作正常,我可以删除和编辑类别这一事实证明了这一点(这样做的函数需要元素的 id。但是我不是通过 ID 字段读取 ID,因为它包含一个字符串,而是通过仅包含 ID 的属性“data-id”(如您在上面的代码中所见)。所以问题仅出在 jQuery 部分而不是 ajax 部分。

Edit2:当我将 selectRootCategory() 添加到 GetCategories() 的成功函数时,它适用于页面加载。但我仍然不明白为什么它不适用于 document.ready()。我不能在GetCategories() 中使用它,因为它会取消选择任何项目并选择“Alle”。

我仍然无法使 selectedEditedCategory 工作。 var categoryid 包含一个有效的 ID,例如training_management_categories_list_a_70.

【问题讨论】:

  • 您的控制台错误是什么?您是否尝试过通过控制台运行该函数并查看它是否按照应有的方式运行?
  • @Adjit 没有错误,如果我手动运行它就可以了。
  • 所以我认为selectRootCategory() 的原因在你的$(document).ready() 函数中不起作用,因为它只会运行一次,很可能在你的动态元素被加载之前。所以你应该做的是使用一个 ajax 回调来确定何时加载了某些数据。由于执行时间,这些函数在您的其他函数中有效。尝试在你的函数中添加一个console.log('inside selected root');,看看它是否真的在执行函数,而不是添加或删除类。

标签: javascript jquery css ajax dynamic


【解决方案1】:

您必须解析从服务器返回的数据并为其添加一个类。

喜欢

  $.ajax({
    ...
    success:function(data){
        $.each(data,function(singleData){
           $(singleData).addClass('blahblah');
        });
    }
    ...
  });

希望对你有帮助

【讨论】:

  • 这不起作用,因为从服务器返回的数据只是创建或更改的元素的 ID。要获取列表,我使用另一个函数 GetCategories() 将 ID 添加到列表项中。这仍然不能解释为什么 selectRootCategory() 在 delete-function 中调用时有效,但在 document.ready() 调用时无效。
  • 为此添加小提琴并不容易,因为它是一个非常庞大的结构。我添加了我认为的所有相关信息。
  • 2 点,第 1 点是:“为什么 selectRootCategory() 在通过删除对话框中的成功函数调用时起作用,但在通过 $document.ready() 调用时不起作用?”
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多