Я впервые работаю с 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. Возможно, вместо идентификатора я должен передать ссылку на выбранный диапазон. Это, вероятно, тоже было бы хорошо, но я не знаю, как этого добиться.
Спасибо, Брайан



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы перейти от диапазона к окружающим 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);
}
Действительно, объект с триггером вставлен в div 'tools', я это пропустил. Спасибо.
Обратные вызовы событий вызываются с объектом события в качестве первого аргумента, вы не можете передать что-то еще таким образом. Этот объект события имеет свойство 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);
}
Проверьте HTML, на самом деле атрибут id имеет прародитель, а не родитель.