Невозможно получить имя класса любого родительского элемента или не удалось определить неопределенный

С rlang и квазиковацией у нас есть другая опция dplyr. Во-первых, получите имена строк, которые мы хотим вычислить для параллельного max для:

iris_cols <- iris %>% select(Sepal.Length:Petal.Width) %>% names()

. Затем мы можем использовать !!! и rlang::syms для вычисления параллельного max для каждой строки этих столбцов:

iris %>%
  mutate(mak=pmax(!!!rlang::syms(iris_cols)))
  • rlang::syms принимает строковый ввод (имена столбцов) и превращает его в символ
  • !!! unquotes и связывает его аргумент, здесь столбец имена

Что дает:

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species mak
1            5.1         3.5          1.4         0.2     setosa 5.1
2            4.9         3.0          1.4         0.2     setosa 4.9
3            4.7         3.2          1.3         0.2     setosa 4.7
4            4.6         3.1          1.5         0.2     setosa 4.6
5            5.0         3.6          1.4         0.2     setosa 5.0

h / t: https://stackoverflow.com/a/47773379/1036500

1
задан david 14 July 2018 в 01:45
поделиться

3 ответа

Вы используете класс ^ = "

Если вы посмотрите на документацию, вы увидите, будет ли это атрибут начинается с селектора [name^=”value”]

Это означает, что атрибут должен be

class="value-abc"

Так что это не соответствует вашему случаю, потому что строка не в самом начале. Вам нужно будет использовать Attribute Contains Selector [name*=”value”]

. Другая проблема: ближайший будет захватывать div div и div, который вы ищете, по-прежнему является великим родителем этого div.

$(function() {
  $(document).on('click','.addfile', function() {
    var elm = $(this).closest('[class*="file-plugin-"]');
    console.log(elm.attr("class"));
    console.log(elm.attr("class").match(/file-plugin-\d+/)[0])

    // how I would do it
    var elem = $(this).closest('[data-index]');
    console.log(elem.data("index"))
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrap1">
    <div class="other class file-plugin-1" data-index="1">
        <div class="wrap2">
            <div class="input-group-append">
                <button type="button" class="remfile">Remove</button>
                <button type="button" class="addfile">Add</button>
            </div>
        </div>
    </div>
</div>

2
ответ дан epascarello 17 August 2018 в 12:03
поделиться
  • 1
    но мне нужно получить элемент рядом с: file-plugin- может иметь элемент с другими аналогичными классами: «файл-плагин-1», «файл-плагин-2», – walter nuñez 14 July 2018 в 01:55
  • 2
    @ walternuñez, что и будет *=. Если вы использовали общий класс для элементов, вы могли бы просто ссылаться на имя класса, и это было бы более эффективно. – epascarello 14 July 2018 в 01:55
  • 3
    ok, но мне нужно только получить имя класса в виде строки = "файл-плагин-1" для этого элемента, но если у элемента есть другое имя класса: file-plugin-2 мне нужно получить это новое. не полностью элемент – walter nuñez 14 July 2018 в 01:59
  • 4
    Так что читайте класс .... – epascarello 14 July 2018 в 02:00
  • 5
    Вот почему вы должны использовать Data Attributes, сделать вашу жизнь намного проще. – epascarello 14 July 2018 в 02:04

Вы можете использовать regex для поиска класса элементов, начиная с определенного текста

$(document).on('click','.addfile', function() {
   var Target = $(this).parents().filter((i, ele)=>ele.className.match(/\bfile-plugin-/)).attr('class')
    console.log(Target);
    });
1
ответ дан Manoj Yadav 17 August 2018 в 12:03
поделиться

Проблема в том, что класс div, который вы после буквально не начинаете с "file-plugin-", он просто содержит его. Вам нужно изучить атрибут класса вручную, JQuery не помогает с этим (что я знаю).

Что-то вроде этого должно работать:

$(function() {
  $(document).on('click','.addfile', function() {
  	// need to be dinamicaly
    var target = $(this).parents("div").filter((_, div) => -1 != div.className.indexOf('file-plugin-'));
    // console.log(target[0]);
    // Or using the "contains" selector (credit to @epascarello)
    target = $(this).parents("div[class*=file-plugin-]");
    var string = target.attr("class").split(" ").filter( clazz => clazz.startsWith('file-plugin-'))[0];
    console.log(string);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrap1">
    <div class="other class file-plugin-1">
        <div class="wrap2">
            <div class="input-group-append">
                <button type="button" class="remfile">Remove</button>
                <button type="button" class="addfile">Add</button>
             </div>
         </div>
    </div>
</div>

1
ответ дан Tibrogargan 17 August 2018 в 12:03
поделиться
  • 1
    ok, но мне нужно только получить имя класса в виде строки = "файл-плагин-1" для этого элемента, но если у элемента есть другое имя класса: file-plugin-2 мне нужно получить это новое. не полностью элемент – walter nuñez 14 July 2018 в 01:58
  • 2
    Сделал изменения, которые делают это – Tibrogargan 14 July 2018 в 02:01
Другие вопросы по тегам:

Похожие вопросы: