Функция slice не работает для document.querySelector. Ошибка .slice is not a function

121
24 сентября 2019, 02:50

Что-то запутался. Почему так? как исправить?

var longtext = document.querySelector('.excerpt>p:nth-child(2)');// <p>long long text</p>
var cuttext = longtext.slice(0, 40); // Uncaught TypeError: longtext.slice is not a function
if (cuttext.length < longtext) {
    cuttext += "...";
}
Answer 1

Используемый метод document.querySelector возвращает только один элемент, а не массив.

Поэтому дальнейшая попытка взять первые сорок элементов(?) из одного выглядит странно.

Чтобы получить коллекцию элементов необходимо воспользоваться методом document.querySelectorAll.

Которая возвращает коллекцию подходящих элементов, однако, у возвращаемой коллекции отсутствует метод slice, и чтобы его применять нужно либо одолжить его у массива, либо преобразовать полученную коллекцию непосредственно в массив, например с помощью Array.from

var longtext = Array.from(document.querySelectorAll('.excerpt>p:nth-child(2)'));
var cuttext = longtext.slice(0,40); //Uncaught TypeError: longtext.slice is not a function
if (cuttext.length < longtext.length) { 
    cuttext+="...";
}

Однако, судя по названию переменных, можно предположить что работа ожидается с текстом, а не html элементами. В этом случае, чтобы получить текст выбранного элемента необходимо было воспользоваться методом textContent, либо если нужно получить текст включая html-теги, innerHTML

var longtext = document.querySelector('.excerpt>p:nth-child(2)').textContent;//long long text
var cuttext = longtext.slice(0,40); //Uncaught TypeError: longtext.slice is not a function
if (cuttext.length < longtext.length) {
    cuttext+="...";
}
Answer 2

cuttext в твоем варианте это не массив, а html collection.

переведи html collection в массив, потом сделай слайс

var arr = Array.prototype.slice.call( longtext )
var cuttext = arr.slice(0,40);

в итоге твой код:

<script type="text/javascript">
    var longtext = document.querySelector('.excerpt>p:nth-child(2)’);
    var arr = Array.prototype.slice.call( longtext );
    var cuttext = arr.slice(0,40);
    if (cuttext.length < longtext) {
        cuttext+="...";
    }
</script>

используя ES2015, я обычно делаю так:

var arr = [...longtext];
READ ALSO
Помогите найти слайдер JS/JQ/WordPress

Помогите найти слайдер JS/JQ/WordPress

Можете мне помочь найти слайдер как на изображении (может кто знает)Может знаете плагин на WordPress, чтобы сделать такой слайдер

118
Повторная загрузка того же файла в форму

Повторная загрузка того же файла в форму

Есть одностраничное react приложение, одна из функций которого - отрисовка некоторых графовЕсть кнопка загрузки пользовательских данных о цвете...

102
jQuery плавные показ фотографии

jQuery плавные показ фотографии

Как мне сделать, чтобы плавно отображалась следующая фотография?(и предыдущая) при клике на next вызывается функция $nextclick, в общем по коду видно

105
Как приблизить только содержимое &lt;iframe&gt;

Как приблизить только содержимое <iframe>

Есть сайт с интерактивной картойСправа поиск и список магазинов(при нажатии на элемент списка, подсвечивается элемент карты), слева список...

112