Я видел, как кто-то сказал, что в этой книге полно лазеек, главным образом потому, что я невнимательно прочитал ее и просто пропустил некоторые простые. Следующее содержание также было тщательно изучено в Интернете для обеспечения точности. Укажите, если есть ошибки
Я давно должен был закончить обновление статей в серии фронтенд-интервью, но мне было лень, и я обнаружил, что некоторые статьи в Интернете действительно хорошо написаны, поэтому я продолжал откладывать это. Но как только я пошел в библиотеку и увидел книгу под названием «Интервью с Цзянху на переднем крае», я просто нашел время, чтобы объединить все содержимое воедино. Здесь должно быть что-то, чего вы не понимаете, и эти вещи могут значительно повысить эффективность вашей разработки. Эта книга была опубликована в мае 2016 года, но в ней все еще рассказывается о JQuery. Так что некоторые места я дополнил
Как обращаться с IE и Firefox при обработке совместимости событий
Получить события:
function et(e) {
let event = window.event || e
}
Получите значение клавиатуры: event.that эквивалентен event.keyCode IE в Firefox
let key = event.keyCode || event.which
Получить источник события:
let target = event.srcElement || event.target
Прослушиватель событий:
IE: element.attacthEvent('on' + eventName, function(){})
Firfox: element.addEventListener(eventName, handler, false)
положение мыши: В IE объект события имеет свойства x, y, в Firefox событие имеет свойства PageX, PageY Все при получении положения мыши:
x = event.x || event.pageX
Заблокировать поведение браузера по умолчанию:
e.preventDefault() || event.returnValue = false
Прекратить всплывать события:
e.stopPropagation() || event.cancelBubble = true
Получить содержимое выбранного элемента в раскрывающемся списке
<select id="test" name="">
<option value="1">text 1</option>
<option value="2">text 2</option>
</select>
Получить индекс выбранного элемента:
let index = document.getElementById('test').selectedIndex.
selectIndex указывает индекс выбранного элемента
Разница между получением и отправкой отправки в форме формы
Этот вопрос обсуждался давно, и я чувствую, что проблему, четко решенную в одном предложении, надо так усложнять. Вот ответ из книги:
1. get — получить данные с сервера, а post — отправить данные на сервер
2. Получить — отправить данные параметра на URL-адрес, на который указывает атрибут действия формы, а значение соответствует каждому полю формы по одному. Сообщение осуществляется через механизм HTTP-сообщения, каждое поле в форме и его содержимое помещаются в ЗАГОЛОВОК HTML и передаются по URL-адресу, на который указывает атрибут действия.
3. Данные, передаваемые get, не могут быть больше 2кб, а данные, передаваемые по почте, больше, но есть ограничения.
4. Показатели безопасности get очень низкие, а безопасность post относительно высока.
5. Get ограничивает значение набора данных формы формы символами ASCII, в то время как post поддерживает весь набор символов ISO10646.
Простая реализация AJAX
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) {
alert(xhr.responseText)
} else {
alert('unsuccessful:' + xhr.status)
}
}
}
xhr.open('get', 'example.txt', true)
xhr.send(null)
Код состояния протокола HTTP
Конкретный контент смотрите на MDN, а я лениво напишу сюда. 1хх: Информация 2xx: успех 3xx: перенаправление 4xx: ошибка клиента 5xx: ошибка сервера
Как JavaScript получает информацию заголовка HTTP-запроса и возвращаемую информацию
getResponseHeader возвращает указанную информацию http из информации ответа getAllResonponseHeaders Получить всю информацию HTTP-заголовка ответа
Простая реализация JSONP
var Jsonp = document.createElement('script')
// Firfox: onload, IE: onreadyStatechange
Jsonp.onload = Jsonp.onreadyStatechange = function () {
if (!this.readyState || this.readyState === 'loaded'
|| this.readyState === 'complete') {
alert($('#demo').html())
// 清理防止IE内存泄露
Jsonp.onload = Jsonp.onreadyStatechange = null
}
}
Jsonp.type = 'text/javascript'
Jsonp.src = 'http://www.xxx.com/JS/JQuery.js'
// 往header里边添加
document.getElementByTagName('head')[0].appendChild(Jsonp)
Знание HTML5 и CSS3
1. Более описательные ярлыки
2. Хорошая медийная поддержка
3. Более мощные веб-приложения
4. Обмен информацией между документами
5. Веб-сокеты
6, Клиентское хранилище
7. Больше красивых страниц
8. Более мощные формы
9. Улучшите доступность
10. Расширенные селекторы
11. Визуальные эффекты
Как вызвать переформатирование страницы, перерисовку
В дополнение к тому, что страница при первой загрузке должна пройти этот процесс, а также следующее поведение вызовет это поведение:
1, добавить элемент dom, изменить, удалить. (Вот почему следует избегать изменения элемента dom, потому что большая часть производительности потребления перерисовывается и перерисовывается)
2. Измените только цвет шрифта элемента DOM (только перерисуйте, потому что нет необходимости настраивать макет)
3. Примените новые стили или измените любые свойства, влияющие на внешний вид элемента.
4. Измените размер окна браузера и прокрутите страницу
5. Прочитайте некоторые атрибуты элемента
Общие методы объектов localStorage
Хранилище: localStorage.setItem(ключ, значение) Получить: localStorage.getItem(ключ) Удалить: localStorage.removeItem(ключ) Удалить все: localStorage.clear()
Разница между файлами cookie, sessionStorage и localStorage
Данные cookie всегда передаются в HTTP-запросах одного и того же источника. Однако sessionStorage и localStorage автоматически не отправляют данные на сервер, а только сохраняют их локально. Данные cookie также имеют концепцию пути, которая может ограничить принадлежность cookie определенному пути.
Ограничение размера хранилища отличается.Данные cookie не могут превышать 4 КБ.В то же время, поскольку каждый HTTP-запрос будет содержать cookie, cookie подходит только для хранения небольших данных. sessionStorage и localStorage также имеют лимиты хранения, но они намного больше
Срок действия данных отличается: sessionStorage: действует только до закрытия текущего окна браузера. localStorage: Всегда доступен, даже когда окно или браузер закрыты. cookie: до тех пор, пока он действителен до установленного времени истечения срока действия файла cookie. Разные области действия: sessionStorage не распределяется между разными окнами браузера (можно ли добиться междоменного доступа с помощью sessionStorage).localStorage совместно используется всеми последовательными портами одного и того же источника. Файлы cookie используются во всех окнах одного и того же происхождения.
SEO с точки зрения внешнего интерфейса
1. CSS-спрайты: вообще говоря, это слияние изображений, которое может объединить некоторые из наиболее распространенных маленьких изображений на веб-сайте в большое изображение.
2. Включите атрибут keep-alive: Keep-Alive можно понимать как длинное соединение. В дополнение к включению свойства Keep-Alive соединения, соединение может сохраняться в течение определенного периода времени, тем самым повышая скорость загрузки страницы.
3. Включите кэширование браузера, вы можете использовать технологию кэширования для повышения скорости загрузки страниц.
4. Включите сжатие GZIP
Улучшить производительность интерфейса
1. Замените куки на веб-хранилище
2. Используйте анимацию CSS вместо анимации JavaScript
3. Используйте клиентскую базу данных
4. Новые функции с использованием JavaScript
5. Используйте аппаратное ускорение
Что делать, если ваш браузер не устанавливает текст, установленный на веб-странице
@font-face {font-family: name; src: url(url); sRules}
Определение таблицы стилей sRules
Расскажите о своем понимании фронтенд-безопасности, о том, что там есть и как это предотвратить.
Проблемы внешней безопасности в основном включают атаки XSS и CSRF.
XSS: атака с использованием межсайтовых сценариев
Он позволяет пользователям внедрять вредоносный код на страницы, предоставляемые другим пользователям, что можно просто понимать как своего рода внедрение кода javascript.
Меры защиты от XSS:
Фильтр ввода и вывода побега
Избегайте использования eval, new Function и т. д. для выполнения строк, если только вы не уверены, что строка не имеет ничего общего с пользовательским вводом.
Используя атрибут httpOnly файла cookie, а также поле cookie этого атрибута, js не может читать и писать
При использовании innerHTML и document.write, если данные вводятся пользователем, ключевые символы объекта необходимо фильтровать и экранировать.
CSRF: подделка межсайтовых запросов
На самом деле, это некоторое поведение на веб-сайте, которое используется хакерами.Когда вы посещаете веб-сайт хакера, вы будете работать на других веб-сайтах.
Меры защиты от CSRF:
Проверьте, является ли реферер http тем же доменным именем
Избегайте длительного хранения зарегистрированных сеансов в клиенте.
Запросы ключей используют код подтверждения или механизм токена.
Некоторые другие методы атаки включают перехват HTTP, перехват операции интерфейса
Методы реализации наследования
Метод использования прототипа не очень хорош, легко ошибиться, рекомендуется использовать класс ES6. Но я не буду говорить об этом здесь, потому что некоторые старые проекты не используют ES6, поэтому необходимо понимать прототип Наследование достигается за счет заимствования конструктора:
function Parent1(){
this.name = "parent1"
}
function Child1(){
Parent1.call(this);
this.type = "child1";
}
Реализуйте наследование, позаимствовав цепочку прототипов:
function Parent2(){
this.name = "parent2";
this.play = [1,2,3];
}
function Child2(){
this.type = "child2";
}
Child2.prototype = new Parent2();
Композиционное наследование:
function Parent3(){
this.name = "parent3";
this.play = [1,2,3];
}
function Child3(){
Parent3.call(this);
this.type = "child3";
}
Child3.prototype = Object.create(Parent3.prototype);
Child3.prototype.constructor = Child3;
Способ создания объекта (из "Продвинутого программирования"):
Заводской узор:
function cratePerson (name, age, job) {
var o = new Object(
o.name = name
o.age = age
o.job = job
o.sayName = function () {
alert(this.name)
}
return o
}
var person1 = cratePerson('Greg', 27, 'Doctor')
Конструктор:
function Person (name, age, job) {
this.name = name
this.age = age
this.job = job
this.sayName = function () {
alert(this.name )
}
}
var person1 = cratePerson('Greg', 27, 'Doctor')
Режим прототипа:
function Person () {
}
Person.prototype.name = 'Greg'
Person.prototype.age = 18
Person.prototype.job = 'Doctor'
Person.prototype.sayName = function () {
alert(this.name)
}
var person1 = new Person()
person1.sayName() // Greg
В этой статье рассказывается только о некоторых теоретических знаниях и редко затрагивается программирование. Что касается программирования, я решил использовать упражнения с литкодом, чтобы объяснить o) Потому что это непросто написать в отдельный блог, чтобы объяснить. пожалуйста следуйте за мнойgithubСледите за прогрессом в реальном времени