Это небольшая проблема, но я застрял. У меня есть кнопка Подробнее для каждого сообщения на странице, которая не сработает, если щелкнуть один раз. Он работает, щелкая по нему столько раз, сколько сообщений на странице.
Вот мой код:
$(function(){
var maxLength = 500;
$(".content-wrapper").each(function(){
var myStr = $(this).html();
if ($.trim(myStr).length > maxLength){
var newStr = myStr.substring(0, maxLength);
var removedStr = myStr.substring(maxLength, $.trim(myStr).length);
$(this).empty().html(newStr);
$(this).append(' <a href = "javascript:void(0);" class = "read-more">read more...</a>');
$(this).append('<span class = "more-text">' + removedStr + '</span>');
}
});
});
$(".read-more").click(function(event){
$(this).hide();
$(this).siblings(".more-text").show();
event.preventDefault();
}); .content-wrapper .more-text{
display: none;
}
<div class = "content-wrapper">
<span style = "color:green"><h4>{{TITLE}}</h4> </span>
{{POST}}
</div>



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


jQuery знает только об элементах на странице во время ее выполнения, поэтому новые элементы, добавленные в DOM, не распознаются jQuery. Чтобы решить эту проблему, используйте делегирование мероприятия, восходящую цепочку событий от вновь добавленных элементов до точки в DOM, которая была там, когда jQuery запускался при загрузке страницы. Многие люди используют document как место для перехвата всплывающего события, но нет необходимости продвигаться вверх по дереву DOM. В идеале вы должны передать полномочия ближайшему родителю, существующему на момент загрузки страницы.
$(document).on('click','read-more', function(event){
$(this).hide();
$(this).siblings(".more-text").show();
event.preventDefault();
});
Вы можете делегировать $('content-wrapper')
Обновлено: вы неправильно скрывали дополнительный контент. Вот весь код:
$(function() {
var maxLength = 500;
$(".content-wrapper").each(function() {
var myStr = $(this).html();
if ($.trim(myStr).length > maxLength) {
var newStr = myStr.substring(0, maxLength);
var removedStr = myStr.substring(maxLength, $.trim(myStr).length);
$(this).empty().html(newStr);
$(this).append(' <a href = "javascript:void(0);" class = "read-more">read more...</a>');
$(this).append('<span class = "more-text">' + removedStr + '</span>');
$('.more-text').hide(); // <-- line added
}
});
$('.content-wrapper').on('click', '.read-more', function(event) {
$(this).hide();
$(this).siblings(".more-text").show();
event.preventDefault();
});
})
Ошибок нет. Я не знаю, почему это не работает.
Это все кода jQuery, который у вас есть на странице? Включили ли вы в проект библиотеку jQuery?
да, это все, что у меня есть, и библиотека jquery включена
У вас есть дополнительный </SPAN> в каждом div, от которого вам нужно избавиться.
Позвольте нам продолжить обсуждение в чате.
Я отредактировал ответ и протестировал код с вашей разметкой
Рад помочь @WannabeJavaGeek
Вы можете сделать, как сказал Джей Бланчард, или вы можете просто прикрепить прослушиватели событий щелчка для элементов класса read-more после добавления таким образом, в исходном коде вы прикрепляли события щелчка к элементам с именем класса read-more сразу после загрузки файла сценария, они делают не существует в то время, если вы переместите прикрепление событий щелчка к элементам с className read-more внутри документа. уже после их добавления они будут работать:
$(function(){
var maxLength = 500;
$(".content-wrapper").each(function(){
var myStr = $(this).html();
if ($.trim(myStr).length > maxLength){
var newStr = myStr.substring(0, maxLength);
var removedStr = myStr.substring(maxLength, $.trim(myStr).length);
$(this).empty().html(newStr);
$(this).append(' <a href = "javascript:void(0);" class = "read-more">read more...</a>');
$(this).append('<span class = "more-text">' + removedStr + '</span>');
}
});
//Now that the read-more className elements exist in the DOM from .append
//Attach the click event handlers
$(".read-more").click(function(event){
$(this).hide();
$(this).siblings(".more-text").show();
event.preventDefault();
});
});
@JayBlanchard В коде OP у них есть код, работающий за пределами document.ready, поэтому он запускается до изменения DOM и включает добавленные элементы с className `read-more ', в этом ответе прикрепление щелчка события выполняются после того, как добавление выполнено в DOM внутри документа.
Вы должны объяснить это в своем ответе, поскольку это не очевидно.
@JayBlanchard Обновил мой ответ, чтобы он стал более понятным.
@WannabeJavaGeek Это не то же самое, и я бы посоветовал вам прочитать комментарий перед ответом, чтобы понять, чем он отличается.
Этот код работает так же, как и то, что я опубликовал.