#javascript #function #parameters #queryselector
Вопрос:
Я новичок в Javascript, я практиковался с функциями и параметрами, и я «наткнулся на стену», когда попытался использовать функции для внесения некоторых изменений в DOM, передавая параметры в тех функциях, которые выполняли бы эту работу. в консоли браузера я получаю:
Uncaught TypeError: document.querySelector(...) is null
classAdder script.js:25
<anonymous> script.js:48
25-я строка-это строка внутри функции classAdder, а 48-я-вызов classAdder.
Заранее спасибо.
// Function decleration
function createArticle(h1, p) {
let art = document.createElement("article");
let data = document.createTextNode("<h1>" [h1] "</h1><p>" [p] "</p>");
art.appendChild(data);
return art;
}
// Arrow Function
const byTagElementAdder = (whereadd, whatadd) => {
document.getElementsByTagName(CSS.escape(whereadd)).innerHTML = whatadd;
};
// Function expression
const classAdder = function (element, classname) {
document
.querySelector(CSS.escape(element))
.setAttribute("class", CSS.escape(classname));
};
// Arrow function
const styleAdder = (element, style) => {
document
.querySelector(CSS.escape(element))
.setAttribute("style", CSS.escape(style));
};
//
// Using the functions
// Creating new article
const firstArt = createArticle(
"The H title",
"The paragraph lorem ipsum bla bla"
);
// adding article in body
byTagElementAdder("body", firstArt);
// adding some style and class
classAdder(firstArt, "art");
styleAdder(firstArt, "width: 100%; margin: 0 auto; padding: 2rem 0 ;");
Комментарии:
1. Что такое
CSS.escape
и что оно возвращает?2.
getElementsByTagName()
возвращает список узлов, а не один элемент. Присвоение емуinnerHTML
не имеет никакого эффекта, вам нужно перебрать все элементы или проиндексировать его,[0]
чтобы получить первое совпадение.3.
classAdder()
иstyleAdder()
ожидайте, что аргумент будет селектором для элемента. Но вы передаете сам элемент, а не селектор.4. И
byTagElementAdder()
ожидаетwhatadd
, что это будет строка HTML, но вы передаете элемент.5. В общем, вы смешиваете элементы DOM, селекторы CSS и строки HTML.
Ответ №1:
Вот некоторые вещи, которые я изменил, чтобы ваш код работал:
- Причина, по которой вы получаете эту ошибку
Uncaught TypeError: document.querySelector(...) is null
, заключается в том, что вы используетеCSS.escape
, для чего нужна строка, но вы передаете элемент dom. Так что вы можете просто использовать.setAttribute
прямо на элементе. - Ваша
byTagElementAdder
функция пыталась вставить innerHTML в массив. Я переключил его на ссылку на первый элемент массива иappendChild
вместо этого использую функцию - В своей
createArticle
функции вы используете acreateTextNode
, но я думаю, что вы хотели бы использоватьcreatElement
дляh1
p1
тега и, как вы это сделали для элемента article.
Вот фрагмент кода
function createArticle(h1, p) {
let art = document.createElement("article");
// this creates text as opposed to the h1 and p elements, which is what I think yu want
let data = document.createTextNode("<h1>" [h1] "</h1><p>" [p] "</p>");
art.appendChild(data);
return art;
}
// Arrow Function
const byTagElementAdder = (whereadd, whatadd) => {
// getElementsByTagName returns an array so you want to choose a value within it
document.getElementsByTagName(CSS.escape(whereadd))[0].appendChild(whatadd)
};
// Function expression
const classAdder = function (element, classname) {
//once you pass in an element you don't need to use document.querySelector, you already have the document
element
.setAttribute("class", CSS.escape(classname));
};
// Arrow function
const styleAdder = (element, style) => {
//once you pass in an element you don't need to use document.querySelector, you already have the document
element
.setAttribute("style", CSS.escape(style));
};
//
// Using the functions
// Creating new article
const firstArt = createArticle(
"The H title",
"The paragraph lorem ipsum bla bla"
);
// adding article in body
byTagElementAdder("body", firstArt);
// adding some style and class
classAdder(firstArt, "art");
styleAdder(firstArt, "width: 100%; margin: 0 auto; padding: 2rem 0 ;");
<body>
</body>
Комментарии:
1. Спасибо, эти изменения сработали! Я тоже пытался использовать . querySelector вместо .getElementByTagName, и это сработало идеально. кроме того, я попытался удалить все CSS.escape() из кода, снова сработало отлично.