Передача параметра из элемента html с помощью jQuery

Я впервые работаю с jQuery, и мне нужна помощь. У меня есть HTML-код, который выглядит следующим образом:

<div id='comment-8' class='comment'>
    <p>Blah blah</p>
    <div class='tools'></div>
</div>

<div id='comment-9' class='comment'>
    <p>Blah blah something else</p>
    <div class='tools'></div>
</div>

Я пытаюсь использовать jQuery для добавления промежутков к разделам .tools, которые вызывают различные функции при нажатии. Функции должны получить идентификатор (либо весь комментарий-8, либо только часть «8») родительского комментария, чтобы затем я мог показать форму или другую информацию о комментарии.

На данный момент у меня есть:

<script type='text/javascript'>

    $(function() {
        var actionSpan = $('<span>[Do Something]</span>');
        actionSpan.bind('click', doSomething);

        $('.tools').append(actionSpan);
     });

     function doSomething(commentId) { alert(commentId); }

</script>

Я застрял в том, как заполнить параметр commentId для doSomething. Возможно, вместо идентификатора я должен передать ссылку на выбранный диапазон. Это, вероятно, тоже было бы хорошо, но я не знаю, как этого добиться.

Спасибо, Брайан

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
36 430
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Чтобы перейти от диапазона к окружающим div, вы можете использовать <tt>parent()</tt> (если вы знаете точное соотношение), например: <tt>$(this).parent().attr('id')</tt>;, или, если структура может быть более глубоко вложенной, вы можете использовать parent () для поиска по дереву DOM. , вот так: <tt>$(this).parents('div:eq(0)').attr('id')</tt>.

Чтобы не усложнять свой ответ, я перестал сопоставлять класс <tt>"comment"</tt>, но, конечно, вы могли бы это сделать, если это поможет сузить область поиска, которую вы ищете.

У вас нет большого контроля над аргументами, передаваемыми в обработчик связанных событий.

Возможно, попробуйте что-то вроде этого для своего определения сделай что-нибудь():

function doSomething() { 
  var commentId = $(this).parent().attr('id');
  alert(commentId); 
}

Проверьте HTML, на самом деле атрибут id имеет прародитель, а не родитель.

Jim 24.09.2008 23:49

Действительно, объект с триггером вставлен в div 'tools', я это пропустил. Спасибо.

Adam Bellaire 24.09.2008 23:55
Ответ принят как подходящий

Обратные вызовы событий вызываются с объектом события в качестве первого аргумента, вы не можете передать что-то еще таким образом. Этот объект события имеет свойство target, которое ссылается на элемент, для которого он был вызван, а переменная this является ссылкой на элемент, к которому был прикреплен обработчик события. Итак, вы могли сделать следующее:

function doSomething(event)
{
    var id = $(event.target).parents(".tools").attr("id");
    id = substring(id.indexOf("-")+1);
    alert(id);
}

...или же:

function doSomething(event)
{
    var id = $(this).parents(".tools").attr("id");
    id = substring(id.indexOf("-")+1);
    alert(id);
}

Возможно, будет проще пролистать комментарии и добавить к каждому инструмент. Таким образом, вы можете дать каждому из них свою функцию. У меня есть функция, возвращающая функцию, поэтому, когда она вызывается позже, ей доступен правильный идентификатор комментария.

Другие решения (которые возвращаются вверх, чтобы найти идентификатор родителя), вероятно, будут более эффективными с точки зрения памяти.

<script type='text/javascript'>

$(function() {
  $('.comment').each(function(comment) {
    $('.tools', comment).append(
      $('<span>[Do Something]</span>')
          .click(commentTool(comment.id));
    );
  });
});

function commentTool(commentId) {
  return function() {
    alert('Do cool stuff to ' + commentId);
  }
}

</script>

Придумайте немного фантазии, чтобы дать вам представление о некоторых вещах, которые вы можете сделать:

var tool = $('<span>[Tool]</span>');

var action = function (id) {
    return function () {
        alert('id');
    }
}

$('div.comment').each(function () {
    var id = $(this).attr('id');

    var child = tool.clone();
    child.click(action(id));

    $('.tools', this).append(child);
});

Функция bind () принимает элемент в качестве параметра (в вашем случае - span), поэтому, чтобы получить от него идентификатор, который вы хотите, вы должны выполнить некоторый обход DOM, например:

function doSomething(eventObject) { 
    var elComment = eventObject.parentNode.parentNode; //or something like that, 
                                                       //didn't test it
    var commentId= elComment.getAttribute('commentId')
    alert(commentId); 
}

Другие вопросы по теме