#javascript
#javascript
Вопрос:
Я проверяю три элемента на их доступность. Если они определены, я выполняю одни и те же действия для каждого элемента. Я хотел бы избежать повторения кода. Как я могу написать это более коротким и эффективным способом?
const studentElem = component.find("students").getElement();
if (studentElem != undefined) {
let studentNoice = studentElem.innerText;
studentNoice = studentNoice.replace('classNo', 'Reg No.');
studentElem.innerHTML = studentNoice;
}
const staffElem = component.find("staff").getElement();
if (staffElem != undefined) {
let staffNoice = staffElem.innerText;
staffNoice = staffNoice.replace('staffNo', 'Staff Rec.');
staffElem.innerHTML = staffNoice;
}
const parentElem = component.find("parents").getElement();
if (parentElem != undefined) {
let parentNoice = parentElem.innerText;
parentNoice = parentNoice.replace('ParentID', 'P-ID.');
parentElem.innerHTML = parentNoice;
}
Комментарии:
1. Предупреждение безопасности: вы должны назначить
innerText
, а неinnerHTML
. В противном случае текстовое содержимое может быть преобразовано в исполняемый скрипт.2. @user2740650 А еще лучше, используйте
.textContent
вместоinnerText
, поскольку он более стандартный и работает немного по-другому.3. @ScottMarcus Спасибо! Может
.textContent
использоваться так же, как и внутренний текст? что вы подразумеваете под «работает немного по-другому»?4. Вы используете
.textContent
так, как хотели бы.innerText
, ноinnerText
(хотя поддерживается везде) является стандартом только в стандарте WHATWG HTML 5, а не в стандарте W3C (например.textContent
, is), поэтому IMO, лучше использовать стандарт W3C. Вы можете прочитать здесь о различиях между ними.
Ответ №1:
У вас правильная идея, это должно быть сокращено. Вы можете сделать это, передав переменные данные в функцию в качестве аргументов и принимая решения на основе этих значений аргументов.
Вам также не нужно явно проверять !=undefinded
. Вы можете просто проверить наличие элемента if(elem)
. И не используйте .innerHTML
, когда строка, с которой вы работаете, не содержит HTML, .innerHTML
что имеет последствия для безопасности и производительности. Используйте .textContent
вместо этого.
Из MDN:
Рекомендуется не использовать innerHTML при вставке обычного текста; вместо этого используйте Node.textContent . Это не анализирует переданный контент как HTML, а вместо этого вставляет его как необработанный текст.
function foo(role, find, replace){
const elem = component.find(role).getElement();
// No need to check for !=undefined because that essentially means
// you are checking for a "truthy" value, which is what an if condition
// checks for by default, so checking the variable itself forces the
// value to be converted to a Boolean. If the element exists, the Boolean
// becomes true and if not, it is false.
if (elem) {
// Setting up variables that are only used once is a bit of a waste
// Just do the work here and there's less code to write and maintain
elem.textContent = elem.textContent.replace(find, replace);
}
}
// You then call the function and pass the variable data
foo("students", 'classNo', 'Reg No.');
foo("staff", 'staffNo', 'Staff Rec.');
foo("parents", 'ParentID', 'P-ID.');
Комментарии:
1. Красиво и очень информативно!! Просто интересно, вместо того, чтобы вызывать функцию 3 раза, можно ли это сделать, используя like a
forEach
?2. @Fergoso Я только демонстрировал синтаксис для вызова функции. Я понятия не имею, как часто нужно будет вызывать функцию, поэтому я действительно не могу сказать, было бы лучше вызывать ее в цикле. Если бы вы собирались использовать
.forEach()
, вам понадобился бы массив для его вызова, и нам не дали достаточно информации, чтобы знать, реально ли это.3. Круто! 🙂 спасибо. это будет вызвано только один раз во время загрузки страницы.
4. @Fergoso Всегда пожалуйста. Не забудьте проголосовать за все полезные ответы и подумайте о том, чтобы отметить этот ответ как «the».
Ответ №2:
Создайте функцию!
function yourBuisnessLogic(componentName, subStr, newSubStr){
const elem = component.find(componentName).getElement();
if (elem != undefined) {
let notice = elem.innerText;
notice = notice.replace(subStr, newSubStr);
elem.innerHTML = notice;
}
}
и вызовы функций :
yourBuisnessLogic("students",'classNo', 'Reg No.');
yourBuisnessLogic("staff",'staffNo', 'Staff Rec.');
yourBuisnessLogic("parents",'ParentID', 'P-ID.');