Резюме из 79 пунктов знаний, которые нельзя игнорировать во фронтенд-разработке

внешний интерфейс JavaScript

Некоторые недостатки в прошлом, через блог, хорошее резюме.

1.css отключить события мыши

.disabled {
    pointer-events: none;
    cursor: default;
    opacity: 0.6;
}

2. Понимание get/post и разницы между ними

http

Протокол передачи гипертекста (HTTP) был разработан для обеспечения связи между клиентами и серверами. HTTP работает по протоколу «запрос-ответ» между клиентом и сервером. Веб-браузер может быть клиентом, а веб-приложение на вашем компьютере может быть сервером.

HTTP-метод:

HEAD: то же, что и GET, но возвращает только заголовки HTTP, а не тело документа. PUT: загрузить указанное представление URI УДАЛИТЬ: удалить указанный ресурс ПАРАМЕТРЫ: возвращает методы HTTP, поддерживаемые сервером. CONNECT: преобразование соединения запроса в прозрачный канал TCP/IP. POST: отправьте данные для обработки на указанный ресурс.

// 查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

GET: запросить данные из указанного ресурса

Разница между GET и POST

GET-запросы могут кэшироваться GET-запросы остаются в истории браузера Запросы GET можно добавить в закладки Запросы GET не следует использовать при работе с конфиденциальными данными. GET-запрос имеет ограничение по длине (2048 символов), IE и Safari — 2k, Opera — 4k, Firefox, Chrome — 8k Запросы GET следует использовать только для получения данных

POST-запросы не кэшируются POST-запросы не сохраняются в истории браузера POST не может быть добавлен в закладки Запросы POST не требуют длины данных

3. Способы реализации полосатой сетки

  1. nth-child(even/odd)
// odd表示基数,此时选中基数行的样式,even表示偶数行
.row:nth-child(odd){
    background: #eee;
}
  1. nth-of-type(odd)
.row:nth-of-type(odd){
    background: #eee;
}
  1. Реализация градиента linear-gradient
.stripe-bg{
  padding: .5em;
  line-height: 1.5em;
  background: beige;
  background-size: auto 3em;
  background-origin: content-box;
  background-image: linear-gradient(rgba(0,0,0,.2) 50%, transparent 0);
}

4.js найти расстояние между двумя точками на плоскости

// 数据可以以数组方式存储,也可以是对象方式
let a = {x:'6', y:10},
        b = {x: 8, y: 20};
    function distant(a,b){
        let dx = Number(a.x) - Number(b.x)
        let dy = Number(a.y) - Number(b.y)
        return Math.pow(dx*dx + dy*dy, .5)
    }

5.css запрещает выбор пользователя

body{
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}

6. Дедупликация массива

// indexOf实现
var array = [1, 1, '1'];

function unique(array) {
    var res = [];
    for (var i = 0, len = array.length; i < len; i++) {
        var current = array[i];
        if (res.indexOf(current) === -1) {
            res.push(current)
        }
    }
    return res;
}

console.log(unique(array));

// 排序后去重
var array = [1, 1, '1'];

function unique(array) {
    var res = [];
    var sortedArray = array.concat().sort();
    var seen;
    for (var i = 0, len = sortedArray.length; i < len; i++) {
        // 如果是第一个元素或者相邻的元素不相同
        if (!i || seen !== sortedArray[i]) {
            res.push(sortedArray[i])
        }
        seen = sortedArray[i];
    }
    return res;
}

console.log(unique(array));

// filter实现
var array = [1, 2, 1, 1, '1'];
function unique(array) {
    var res = array.filter(function(item, index, array){
        return array.indexOf(item) === index;
    })
    return res;
}
console.log(unique(array));

// 排序去重
var array = [1, 2, 1, 1, '1'];
function unique(array) {
    return array.concat().sort().filter(function(item, index, array){
        return !index || item !== array[index - 1]
    })
}
console.log(unique(array));

// Object键值对
var array = [{value: 1}, {value: 1}, {value: 2}];

function unique(array) {
    var obj = {};
    return array.filter(function(item, index, array){
        console.log(typeof item + JSON.stringify(item))
        return obj.hasOwnProperty(typeof item + JSON.stringify(item)) ? false : (obj[typeof item + JSON.stringify(item)] = true)
    })
}

console.log(unique(array)); // [{value: 1}, {value: 2}]

// ES6 Set实现
var unique = (a) => [...new Set(a)]

7. Что такое CDN и преимущества CDN

CDN: CDN является исходной станцией для ближайшего к пользователю узла распространения контента, поэтому пользователь может удобно получать желаемый контент, повышать скорость отклика и вероятность успешного доступа пользователя. Решение проблемы распределения, пропускной способности, производительности сервера приводит к проблеме задержки доступа для ускорения сайта, по требованию, трансляции и других сцен. выгода: 1, многодоменные ресурсы загрузки При нормальных обстоятельствах браузер запрашивает количество одновременных подключений под одним доменным именем (загрузка файла), обычно до 4, затем первые пять надстроек будут заблокированы до тех пор, пока не будет загружен предыдущий файл. Поскольку файлы CDN хранятся в разных областях (разные IP-адреса), браузер может загружать все файлы, необходимые странице, одновременно (гораздо больше, чем 4), чтобы повысить скорость загрузки страницы.

2. Возможно, файл уже был загружен и сохранен в кеше Некоторые распространенные библиотеки js или библиотеки стилей css, такие как jQuery, очень распространены в сети. Когда пользователь просматривает одну из ваших веб-страниц, очень вероятно, что он посетил другой веб-сайт через CDN, используемый вашим веб-сайтом, и бывает, что этот веб-сайт также использует jQuery, тогда браузер пользователя уже кэшировал файл jQuery ( если файл с таким же именем и тем же IP-адресом кэшируется, браузер будет напрямую использовать кэшированный файл и не будет загружать его снова), поэтому он не будет загружаться снова, что косвенно повышает скорость доступа к веб-сайту.

3. Высокая эффективность Каким бы хорошим ни был ваш сайт, он не пройдет Baidu NB и Google, верно? Хороший CDN обеспечит более высокую эффективность, более низкую задержку в сети и более низкий уровень потери пакетов.

4. Распределенный ЦОД Если ваш сайт находится в Пекине, когда пользователь из Гонконга или дальше посещает ваш сайт, его запрос данных неизбежно будет очень медленным. А CDN позволят пользователю загружать нужные файлы с ближайшего к нему узла, поэтому улучшение скорости загрузки — само собой разумеющееся.

5. Анализ использования В обычных условиях поставщики CDN (такие как Baidu Cloud Accelerator) будут предоставлять функции статистики данных, вы сможете узнать больше о доступе пользователей к вашему собственному веб-сайту, а также сможете своевременно внести соответствующие коррективы на свой веб-сайт в соответствии со статистическими данными.

6. Эффективно предотвратите атаки на сайт При нормальных обстоятельствах провайдеры CDN также будут предоставлять услуги по обеспечению безопасности веб-сайтов.

8. Схема «Святой Грааль» и схема «Двойное крыло»

Ссылка на ссылку

9. Регулярное выражение, соответствующее номеру мобильного телефона

function checkPhone(){
    if(!(/^1[345678]\d{9}$/.test(phone))){
        alert("手机号码有误,请重填");
        return false;
    }
}

10. Как улучшить скорость загрузки первой частоты

1. Внешний файл js размещается внизу тела, а внешний файл css размещается в голове 2. Используйте как можно больше поддоменов для статических http-ресурсов 3. Лучше всего включать gzip, когда сервер предоставляет статические ресурсы html и http. 4. Установите expires, last-modified в заголовках http ответов js, css, img и других ресурсов. 5. Минимизируйте количество http-запросов 6. сжатие ресурсов js/css/html/img 7. Используйте css spirtes, чтобы уменьшить количество запросов img 8. Ленивая загрузка больших изображений с помощью lazyload 9. Избегайте 404 и уменьшите охват js 10. Уменьшение размера файла cookie может ускорить получение ответа 11. Уменьшите количество элементов dom 12. Используйте асинхронные скрипты для динамического создания скриптов

11. Ядро браузера (движок рендеринга)

Браузер IE/360/Sogou: Trident Chrome/Safari/Opera: WebKit (форк KHTML с открытым исходным кодом) (Хотя мы называем WebKit ядром браузера, не следует напрямую вызывать механизм рендеринга, поскольку сам WebKit в основном состоит из двух движков, один из которых — движок рендеринга «WebCore», а другой — механизм интерпретации javascript «JSCore». , все они получены из механизма рендеринга KDE KHTML и механизма интерпретации javascript KJS.) (Начиная с версии Chrome 28.0.1469.0, выпущенной в 2013 г., Chrome отказался от движка Chromium и перешел на новейший движок Blink (основанный на WebKit2 — новый движок WebKit, запущенный Apple в 2010 г.), сравнение Blink с предыдущим поколением. это оптимизированный код, улучшенная структура DOM и повышенная безопасность.) (Чтобы сократить расходы на исследования и разработки, Opera объявила в феврале 2013 года, что откажется от Presto и вместо этого последует за Chrome, чтобы использовать движок Chromium ветки WebKit в качестве собственного основного движка браузера) Firefox/SeaMonkey: геккон

12. Процесс рендеринга в браузере и предложения по оптимизации

1)解析: 一个是HTML/SVG/XHTML,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。 CSS,解析CSS会产生CSS规则树。 Javascript,脚本,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree. 2)渲染:浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree。 Уведомление: Rendering Tree 渲染树并不等同于DOM树,因为一些像Header或display:none的东西就没必要放在渲染树中了。 CSS 的 Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。 然后,计算每个Frame(也就是每个Element)的位置,这又叫layout和reflow过程。 3)绘制:最后通过调用操作系统Native GUI的API绘制。

Уменьшить оплавление и перерисовку 1) Не изменяйте стили DOM один за другим. Лучше заранее определить класс CSS, а затем изменить className DOM.

  1. Переведите DOM в автономный режим и измените его. Такие как: Используйте объект documentFragment для управления DOM в памяти. Сначала задайте DOM display:none (с перекомпоновкой), а затем измените его по своему усмотрению. Например, измените его 100 раз, а затем снова отобразите. Клонируйте ноду DOM в память, а потом меняйте как хотите, после изменения меняйте на онлайн. 3) Не помещайте значение атрибута узла DOM в цикл как переменную в цикле. В противном случае это приведет к большому количеству чтения и записи свойств этого узла. 4) Используйте фиксированные или абсолютные позиции для анимированных HTML-элементов, попробуйте использовать transfoem, тогда изменение их CSS не приведет к перекомпоновке. 5) Минимизируйте использование макетов таблиц. Потому что небольшое изменение может привести к перестановке всей таблицы.

13. В чем разница между использованием link и @import, когда страница импортирует стили?

(1) ссылка — это тег XHTML. Помимо загрузки CSS, его также можно использовать для определения RSS, определения атрибутов соединения rel и т. д., тогда как @import предоставляется CSS и может использоваться только для загрузки CSS; (2) Когда страница загружена, ссылка будет загружена одновременно, и CSS, на который ссылается @import, будет ждать загрузки страницы перед загрузкой; (3) импорт предлагается CSS2.1, который может быть распознан только в IE5 или более поздних версиях, а ссылка является тегом XHTML, и нет проблем с совместимостью; (4) link поддерживает использование js для управления DOM для изменения стиля, а @import — нет;

14. Кратко опишите свое понимание семантики HTML?

Делайте правильные вещи с правильным ярлыком. Семантика HTML делает содержимое страницы структурированным, что удобно для парсинга браузерами и поисковыми системами; Отображается в одном формате документа, даже без стилей CSS, и легко читается; Сканеры поисковых систем также полагаются на теги HTML для определения контекста и веса каждого ключевого слова, что хорошо для SEO; Сделайте так, чтобы людям, читающим исходный код, было проще разделить сайт на блоки, чтобы их было легко читать, поддерживать и понимать.

15. Пожалуйста, опишите разницу между файлами cookie, sessionStorage и localStorage?

Файл cookie — это данные (обычно зашифрованные), которые хранятся на локальном терминале пользователя (на стороне клиента) веб-сайтом для идентификации пользователя. Данные cookie всегда передаются в HTTP-запросах одного и того же источника (даже если они не нужны) и передаются между браузером и сервером. sessionStorage и localStorage не отправляют данные на сервер автоматически, а только сохраняют их локально.

Размер хранилища: Размер данных cookie не может превышать 4 КБ. Хотя sessionStorage и localStorage также имеют ограничения на размер хранилища, они намного больше, чем файлы cookie, и могут достигать 5 МБ и более.

Период: localStorage хранит постоянные данные, данные не будут потеряны после закрытия браузера, если данные не будут активно удалены; Данные sessionStorage автоматически удаляются после закрытия текущего окна браузера. Файл cookie остается в силе до истечения срока действия файла cookie, даже если окно или браузер закрыты.

16. Каковы недостатки iframe?

*iframe будет блокировать событие Onload главной страницы; * Поисковая программа поисковой системы не может интерпретировать такие страницы, что не способствует поисковой оптимизации; * iframe и главная страница делят пул соединений, а в браузере есть ограничения на подключение одного и того же домена, поэтому это повлияет на параллельную загрузку страницы. Эти два недостатка необходимо учитывать перед использованием iframe. Если вам нужно использовать iframe, желательно через javascript Динамически добавляйте значение атрибута src в iframe, что позволяет обойти две вышеупомянутые проблемы.

17. Порядок и функции жизненного цикла родительско-дочерних компонентов Vue?

(Изображение взято с официального сайта vue. Дополнительные рекомендации по обучению vue см. на официальном сайте для просмотра подробных документов)

18. Для чего нужен код веб-проверки и какую проблему безопасности он решает?

Общедоступная полностью автоматическая программа, которая различает, является ли пользователь компьютером или человеком. Это может предотвратить злонамеренный взлом паролей, считывание билетов и флуд на форуме; Эффективно предотвращайте постоянные попытки хакеров войти в систему для определенного зарегистрированного пользователя, используя определенный метод взлома программы методом грубой силы.

19. Представляете стандартную блочную модель CSS? Чем отличается блочная модель младших версий IE?

(1) Существует два типа: блочная модель IE и блочная модель W3C; (2) Блочная модель: содержимое, отступы, поля, границы; (3) Отличие: содержательная часть IE учитывает границы и отступы;

20. Позиционное значение относительного и абсолютного позиционирования?

абсолютный Создает абсолютно позиционированный элемент, позиционированный относительно первого родительского элемента, значение которого не является статическим. исправлено (не поддерживается старым IE) Генерирует абсолютно позиционированные элементы, расположенные относительно окна браузера. родственник Создает относительно позиционированный элемент, расположенный относительно его нормального положения. статический По умолчанию. Без позиционирования элемент отображается в обычном потоке (игнорируя объявления верхнего, нижнего, левого и правого z-index). наследовать Указывает на наследование значения свойства position от родительского элемента.

21. Какова совместимость часто встречающихся браузеров? Причина, каково решение и часто используемые методы взлома?

  • 24-битные изображения PNG имеют фон в браузерах iE6, решение состоит в том, чтобы сделать их PNG8.
  • Поля и отступы по умолчанию в браузере отличаются. Решение состоит в том, чтобы добавить глобальное *{margin:0;padding:0;} для унификации.

  • Ошибка двойного поля IE6: после того, как метка атрибута блока является плавающей и есть горизонтальное поле, поле, отображаемое в IE6, больше, чем настройка.

    Двойное расстояние от плавающего, т.е. #box{ float:left; width:10px; margin:0 0 0 100px;}

    В этом случае IE создаст расстояние 20px.Решение состоит в том, чтобы добавить --_display:inline; к элементу управления стилем метки float, чтобы преобразовать его во встроенный атрибут. (_ Этот символ распознается только ie6)

    Метод прогрессивной идентификации постепенно исключает части из целого.

    Во-первых, разумное использование тега "\9" отделяет браузер IE от всех ситуаций. Затем снова используйте «+», чтобы отделить IE8 от IE7 и IE6, чтобы IE8 распознавался независимо.

    css .bb{ background-color:red;/Все идентификации/ background-color:#00deff\9; /IE6, 7, 8 распознавание/ +background-color:#a200ff;/IE6, 7 распознавание/ _background-color:#1e0bd1;/IE6-распознавание/ }

  • В IE вы можете использовать метод получения обычных свойств для получения пользовательских свойств, Вы также можете использовать getAttribute() для получения пользовательских атрибутов; В Firefox вы можете использовать getAttribute() только для получения пользовательских атрибутов. Решение. Получите единые настраиваемые атрибуты с помощью getAttribute().

  • В IE четный объект имеет атрибуты x, y, но не имеет атрибутов pageX, pageY; В Firefox объект события имеет свойства pageX, pageY, но не имеет свойств x, y.

  • Решение: (Условный комментарий) Недостатком является то, что это может увеличить количество дополнительных HTTP-запросов под браузером IE.

  • В китайском интерфейсе Chrome текст размером менее 12 пикселей по умолчанию будет принудительно отображаться с размером 12 пикселей. Это можно решить, добавив в CSS свойство -webkit-text-size-adjust: none;.

Стиль наведения не отображается после доступа к гиперссылке. Стиль гиперссылки, который был нажат и посещен, больше не имеет наведения и активности. Решение состоит в том, чтобы изменить порядок свойств CSS: L-V-H-A : a: ссылка {} a: посещение {} a: наведение {} a: активно {}

22. Как можно оптимизировать CSS и повысить производительность?

ключевой селектор. Последняя часть селектора — это ключевой селектор (то есть часть, используемая для сопоставления с целевым элементом); Если правило имеет селектор ID в качестве ключевого селектора, не добавляйте метку к правилу. отфильтровать лишние правила (чтобы система стилей не тратила время на их сопоставление); Извлеките общий общедоступный стиль проекта, улучшите возможность повторного использования и напишите компоненты в соответствии с модулями, улучшите совместную разработку, ремонтопригодность и расширяемость проекта; Используйте инструменты предварительной обработки или инструменты сборки (gulp выполняет проверку синтаксиса в CSS, автоматическое заполнение префиксов, упаковку и сжатие, а также автоматическую плавную деградацию);

23. Как изменить желтый фон формы автозаполнения после того, как хром запомнит пароль?

 input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
    background-color: rgb(250, 255, 189); /* #FAFFBD; */
    background-image: none;
    color: rgb(0, 0, 0);
  }

24. Как с помощью CSS сделать шрифты на странице четче и тоньше?

-webkit-font-smoothing: antialiased;

25. Сделать overflow:scroll плавно?

-webkit-overflow-scrolling: touch;

26. Как добавить запятую через каждые три цифры слева от числа с плавающей запятой, например 12000000,11, в «12 000 000,11»?

function commafy(num){
  	return num && num
  		.toString()
  		.replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){
  			return $2 + ',';
  		});
  }

27. Области действия Javascript?

Глобальная функция не может просматривать внутренние сведения о локальной функции, но локальная функция может просматривать сведения о вышестоящих функциях вплоть до глобальных сведений. Когда вам нужно найти свойство или метод из локальной функции, если текущая область не найдена, она вернется к верхней области, чтобы найти, Вплоть до глобальной функции такой формой организации является цепочка содержания.

28. Расскажите о понимании этого объекта.

this всегда относится к прямому вызывающему объекту функции (а не к косвенному вызывающему); Если есть новое ключевое слово, оно указывает на объект из нового; В событии this указывает на объект, вызвавший событие.В частности, this в attachEvent в IE всегда указывает на глобальный объект Window;

29. Что делает eval?

Его функция состоит в том, чтобы преобразовать соответствующую строку в код JS и запустить ее; Следует избегать использования eval, что является небезопасным и очень требовательным к производительности (2 раза, один раз анализируется в оператор js и один раз выполняется). При преобразовании из строки JSON в объект JSON вы можете использовать eval, var obj =eval('('+ str +')');

30. Что такое объект окна, что такое объект документа?

Объект окна относится к окну, открытому браузером. Объект документа является доступной только для чтения ссылкой на объект Documentd (объект документа HTML), свойство объекта окна.

31. ["1", "2", "3"].map(parseInt) Какой ответ?

["1", "2", "3"].map(parseInt) Ответ: [1, NaN, NaN]

32. Что такое замыкание и зачем его использовать?

Замыкание — это функция, которая имеет доступ к переменным в области действия другой функции. Наиболее распространенный способ создания замыкания — создать другую функцию внутри функции и получить доступ к локальным переменным этой функции через другую функцию. область действия и передавать переменные и методы внутри функции наружу.

33. Что означает "использовать строго" в коде javascript? В чем разница между его использованием?

Режим, который делает кодирование JS более стандартизированным, устраняет некоторые необоснованные и неточные аспекты синтаксиса Javascript и снижает некоторые странности поведения. Плохие функции, поддерживаемые по умолчанию, отключены, например, не использовать with и не присваивать значения глобальным переменным в непредвиденных ситуациях; Показать объявление глобальных переменных, функции должны быть объявлены на верхнем уровне, функции не могут быть объявлены в нефункциональных блоках кода, arguments.callee также не разрешено; Обеспечить безопасность работы кода и ограничить модификацию аргументов в функциях; Улучшить эффективность компилятора и увеличить скорость работы;

34. Как узнать, принадлежит ли объект определенному классу?

if(a instanceof Person){
   alert('yes');
}
// 判断对象类型最好的方式
// 对于 Object 对象,直接调用 toString()  就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

35. Процесс создания нового объекта

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

36. Ajax решает проблемы с кешем браузера

1. Плюс Anyajaxobj.SetRequestHeajaxobj.SetRequestHeajaxobj.SetRequestHeajaxobj.SetRequestHeajaxobj.SetRequestHeajaxobj.SetRequestHeajaxobj.SetRequestHeader ("IF-Modified-Since").

2. Добавьте anyAjaxObj.setRequestHeader("Cache-Control", "no-cache") перед отправкой запроса ajax. 3. Добавьте случайное число после URL: "fresh=" + Math.random();. 4. Добавьте метку времени после URL-адреса: "nowtime=" + new Date().getTime();. 5. Если вы используете jQuery, просто выполните $.ajaxSetup({cache:false}). Таким образом, все ajax страницы будут выполнять этот оператор, поэтому нет необходимости сохранять запись в кеше.

37. Как решить междоменные проблемы?

jsonp, iframe, window.name, window.postMessage, установить прокси-страницу на сервере

38. Как делать модульную разработку

Выполнение функции немедленно, без раскрытия закрытых членов

var module1 = (function(){
     &emsp;&emsp;&emsp;&emsp;var _count = 0;
     &emsp;&emsp;&emsp;&emsp;var m1 = function(){
     &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;//...
     &emsp;&emsp;&emsp;&emsp;};
     &emsp;&emsp;&emsp;&emsp;var m2 = function(){
     &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;//...
     &emsp;&emsp;&emsp;&emsp;};
     &emsp;&emsp;&emsp;&emsp;return {
     &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;m1 : m1,
     &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;m2 : m2
     &emsp;&emsp;&emsp;&emsp;};
     &emsp;&emsp;})();

39. В чем разница между спецификациями AMD (Modules/Asynchronous-Definition) и CMD (Common Module Definition)?

  1. Для зависимых модулей AMD — раннее выполнение, CMD — отложенное выполнение. Однако, начиная с RequireJS 2.0, он также был изменен для задержки выполнения (в зависимости от метода написания метод обработки отличается). 2. CMD выступает за то, чтобы полагаться на ближнее, а AMD за то, чтобы полагаться на переднее.
// CMD
 define(function(require, exports, module) {
     var a = require('./a')
     a.doSomething()
     // 此处略去 100 行
     var b = require('./b') // 依赖可以就近书写
     b.doSomething()
     // ...
 })

 // AMD 默认推荐
 define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
     a.doSomething()
     // 此处略去 100 行
     b.doSomething()
     // ...
 })

40. Каков основной принцип requireJS? (Как загружать динамически? Как избежать многократной загрузки? Как кешировать?)

Ссылка на ссылку

41. Как реализовать загрузчик модулей

Ссылка на ссылку

42. Перечислите несколько основных спецификаций кода JavaScript.

(1) Не объявляйте несколько переменных в одной строке (2) Если вы не знаете длину массива, используйте push (3) Пожалуйста, используйте ===/!== для сравнения true/false или значений (4) Используйте одинарные кавычки '' для строк (поскольку в большинстве случаев наши строки. Особенно html будут отображаться ") (5) Используйте литералы объектов вместо нового массива (6) Никогда не объявляйте функцию в нефункциональном блоке и не назначайте эту функцию переменной. Браузеры позволяют это сделать, но парсят они по-разному. (7) Не используйте глобальные функции (8) Всегда используйте var для объявления переменных. В противном случае это приведет к глобальным переменным. Нам нужно избегать загрязнения глобального пространства имен. (9) Оператор Switch должен иметь ветку по умолчанию. (10) Используйте /**...*/ для многострочных комментариев, включая описания, указанные типы, значения параметров и возвращаемые значения. (11) Функция не должна иногда возвращать значение, а иногда вообще не возвращать значение (12) В конце оператора должна быть добавлена ​​точка с запятой. (13) Для циклов необходимо использовать фигурные скобки (14) Оператор If должен использовать фигурные скобки (15) Переменные в циклах for-in должны быть четко определены с помощью ключевого слова var, чтобы избежать загрязнения области видимости. (16) Избегайте односимвольных имен и делайте имена переменных описательными. (17) При именовании объектов, функций и экземпляров используйте соглашения об именах с верблюжьим регистром. (18) Назначать методы прототипу объекта вместо переопределения прототипа новым объектом, что может затруднить наследование.

43. Работа с DOM — как добавлять, удалять, перемещать, копировать, создавать и находить узлы?

1) Создайте новый узел СозданиеCumentFragment () // Создать фрагмент DOM CreateeEdement () // Создать определенный элемент CreateTextnode () // Создать текстовый узел (2) Добавить, удалить, заменить, вставить AppendChild () Removechild () reflacechild () insertforefore () // Вставьте новый узел дочернего ребенка до существующего ребенка (3) найти getelementsbytagname () // по имени метки GetElementsByName () // Передайте значение атрибута имени элемента (т.е. имеет сильную толерантность неисправностей и получит массив, включая идентификатор, равный значению имени) GetElementbyID () // по идентификатору элемента, уникальный

44. Принцип реализации jQuery

Ссылка на ссылку

45. Как преобразовать массив в строку json в jquery, а затем преобразовать обратно?

jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展: 
 $.fn.stringifyArray = function(array) {
        return JSON.stringify(array)
    }

    $.fn.parseArray = function(array) {
        return JSON.parse(array)
    }

    然后调用:
    $.fn.stringifyArray(array)

46. ​​Принцип глубокого и поверхностного копирования $.extend в jQuery

// 浅复制
$ = { 

     extend : function(target, options) { 

        for (name in options) { 

            target[name] = options[name]; 

        } 

        return target; 

    } 

}; 
// 深复制
$ = { 
   extend : function(deep, target, options) { 
       for (name in options) { 
           copy = options[name]; 
           if (deep && copy instanceof Array) { 
               target[name] = $.extend(deep, [], copy); 
           } else if (deep && copy instanceof Object) { 

              target[name] = $.extend(deep, {}, copy); 
           } else { 
              target[name] = options[name]; 
          } 
      } 

     return target; 
  }
};

47. В чем разница между jquery.extend и jquery.fn.extend?

  • jquery.extend добавляет метод класса в класс jquery, что можно понимать как добавление статического метода
  • jquery.fn.extend: В исходном коде jquery.fn = jquery.prototype, поэтому расширение jquery.fn заключается в добавлении функций-членов в класс jquery. использовать: Расширение jquery.extend нужно вызывать через класс jquery, а расширение jquery.fn.extend, все экземпляры jquery можно вызывать напрямую.

48. Как определить, запущен ли текущий скрипт в среде браузера или узла? (Али)

this === window ? 'browser' : 'node';

49. Создайте веб-сайт, на котором операция страницы не будет обновлять всю страницу и сможет правильно реагировать, когда браузер перемещается вперед и назад. Дайте свой технический план реализации?

Ссылка на ссылку

50. В чем разница между размещением тега Script внизу страницы до закрытия тела и после его закрытия? Как браузеры будут их анализировать?

Ранее рекомендуемый метод (устарел): Предыдущее решение этой проблемы состояло в том, чтобы поместить тег script после тега body, что гарантировало, что он не будет завершен сценарием до тех пор, пока

не будет проанализирован. Этот метод проблематичен: браузер не может загрузить файл сценария, пока не будет проанализирован весь документ.Если документ большой, после анализа HTML пользователю все равно придется дождаться загрузки и выполнения файла сценария, прежде чем работать с веб-сайтом.

Теперь рекомендуемое решение: Теги скриптов браузера теперь поддерживают атрибуты async и defer. Применение этих атрибутов при загрузке скриптов делает браузеры более безопасными и параллельными загрузками (загрузка скриптов не блокирует анализ HTML). 1. Сценарий, помеченный как async, выполняет загрузку асинхронно и выполняет ее. Это означает, что загрузка скрипта не блокирует синтаксический анализ HTML, и скрипт выполняется сразу после завершения загрузки. 2. Скрипт тега defer выполняется последовательно. Этот метод также не блокирует парсинг HTML браузером. В отличие от асинхронного, скрипты отсрочки выполняются последовательно после загрузки скриптов во всем документе.

51. Объект JQuery может одновременно связывать несколько событий. Как это достигается?

 //多个事件同一个函数:
 	$("div").on("click mouseover", function(){});
 //多个事件不同函数
 	$("div").on({
 		click: function(){},
 		mouseover: function(){}
 	});

52. Что такое внешняя маршрутизация? Принцип реализации front-end маршрутизации

Ссылка на ссылку

53. Какие есть способы определить версию браузера?

  功能检测、userAgent特征检测

  比如:navigator.userAgent
  //"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36
    (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"

54. Что такое полифилл?

Полифилы — это «дополнения JavaScript, которые копируют стандартные API в старых браузерах» и могут динамически загружать код или библиотеки JavaScript для их эмуляции в браузерах, которые не поддерживают эти стандартные API. Например, полифилл геолокации может добавить в объект навигатора глобальный объект геолокации, а также функцию getCurrentPosition и объект обратного вызова «координаты», Все это объекты и функции, определенные W3C Geolocation API. Поскольку полифиллы эмулируют стандартные API-интерфейсы, можно разрабатывать на основе этих API-интерфейсов таким образом, чтобы они были ориентированы на будущее для всех браузеров. Как только поддержка этих API станет абсолютным большинством, полифиллы можно будет легко удалить без какой-либо дополнительной работы.

55. Вы когда-нибудь использовали или реализовывали в своих проектах какие-то полифилл-решения (решения совместимости)?

html5shiv, геолокация, заполнитель

56. Мы привязываем два события клика к dom одновременно, одно с захватом и одно с пузырем. Сколько раз будет выполняться событие, будет ли сначала выполняться всплытие или захват?

Согласно стандарту W3C, сначала происходит захват, а затем всплытие. Порядок всех событий следующий: событие этапа захвата другого элемента -> событие последовательности кода этого элемента -> событие этапа всплытия другого элемента

// div-capture > btn-bubble > btn-capture > div-bubble
var btn = document.querySelector('button');
var div = document.querySelector('div');

btn.addEventListener('click', function(){
    console.log('bubble','btn');
},false);
btn.addEventListener('click', function(){
    console.log('capture','btn');
},true);

div.addEventListener('click', function(){
    console.log('bubble','div');
},false);
div.addEventListener('click', function(){
    console.log('capture','div');
},true);

57. Принцип реализации горячего обновления Webpack?

  1. Во время компиляции Webpack вставьте код горячего обновления для записи, требующей горячего обновления (связь EventSource).
  1. После первого открытия страницы сервер и клиент устанавливают канал связи через EventSource и возвращают следующий хэш на внешний интерфейс.
  2. Клиент получает хэш, и этот хэш будет использоваться в качестве хэша для следующего запроса к серверу hot-update.js и hot-update.json
  3. После изменения кода страницы Webpack начинает компиляцию после отслеживания модификации файла и отправляет клиенту сообщение о сборке.
  4. Клиент получает хэш и после успеха создает ссылку на скрипт hot-update.js, а затем вставляет основной документ.
  5. После успешной вставки hot-update.js выполните методы createRecord и reload hotAPI, получите метод рендеринга компонента Vue, выполните повторный рендеринг компонента, а затем реализуйте обновление пользовательского интерфейса без обновления.

58. Функция дросселирования и стабилизации

Ссылка на ссылку

59. Как работает рефакторинг страницы?

Рефакторинг веб-сайта: упростите структуру и улучшите читаемость без изменения внешнего поведения, сохраняя при этом согласованное поведение на интерфейсе веб-сайта. То есть оптимизация веб-сайта без изменения пользовательского интерфейса и поддержание согласованного пользовательского интерфейса при расширении.

Для традиционных веб-сайтов рефакторинг обычно заключается в следующем:

Макет таблицы изменен на DIV+CSS. Сделать внешний интерфейс веб-сайта совместимым с современными браузерами (для нестандартного CSS, например, допустимого для IE6) Оптимизирован для мобильных платформ Оптимизирован для SEO Аспекты, которые следует учитывать при глубоком рефакторинге веб-сайта

Уменьшите связь между кодом Сделайте свой код гибким Пишите код строго по спецификации Разработка расширяемых API Замените старый фреймворк, язык (например, VB) Улучшить пользовательский опыт Обычно в рефакторинг включаются и оптимизации по скорости

Сжатие внешних ресурсов, таких как JS, CSS и изображения (обычно решается сервером). Оптимизация производительности программы (например, чтение и запись данных) Используйте CDN для ускорения загрузки ресурсов Оптимизация для JS DOM Кэширование файлов для HTTP-серверов

60. Перечислите функции, которые отличают IE от других браузеров.

События бывают разные:

 	触发事件的元素被认为是目标(target)。而在 IE 中,目标包含在 event 对象的 srcElement 属性;

获取字符代码、如果按键代表一个字符(shift、ctrl、alt除外),IE 的 keyCode 会返回字符代码(Unicode),DOM 中按键的代码和字符是分离的,要获取字符代码,需要使用 charCode 属性;

阻止某个事件的默认行为,IE 中阻止某个事件的默认行为,必须将 returnValue 属性设置为 false,Mozilla 中,需要调用 preventDefault() 方法;

停止事件冒泡,IE 中阻止事件进一步冒泡,需要设置 cancelBubble 为 true,Mozzilla 中,需要调用 stopPropagation();

61. У вас есть собственное мнение о сильных и слабых сторонах Node?

*(Преимущество) Поскольку Node управляется событиями и не блокируется, он очень удобен для обработки одновременных запросов, Таким образом, прокси-серверы, построенные на Node, работают намного лучше, чем серверы, реализованные на других технологиях (таких как Ruby). Кроме того, клиентский код, взаимодействующий с прокси-сервером Node, написан на языке javascript. Так что и клиент, и сервер написаны на одном языке, и это замечательно.

*(Недостаток) Node — относительно новый проект с открытым исходным кодом, поэтому он не очень стабилен, постоянно меняется, И ему не хватает поддержки сторонних библиотек. Это похоже на Ruby/Rails в прошлом.

62. Какие методы оптимизации производительности внешнего интерфейса вы использовали?

(1) Уменьшите количество http-запросов: спрайты CSS, JS, сжатие исходного кода CSS, соответствующий контроль размера изображения; веб-страница Gzip, хостинг CDN, кеш данных, сервер изображений.

(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数

(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。

(4) 当需要设置的样式很多时设置className而不是直接操作style。

(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。

(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。

(7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。

(8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语言是无法“优化”的。

63. http

1** (информационный класс): указывает, что запрос получен и обработка продолжается. 100 - Клиент должен продолжать делать запросы 101 - Клиент просит сервер преобразовать версию протокола HTTP в соответствии с запросом

2**(响应成功):表示动作被成功接收、理解和接受
200——表明该请求被成功地完成,所请求的资源发送回客户端
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求

3**(重定向类):为了完成指定的动作,必须接受进一步处理
300——请求的资源可在多处得到
301——本网页被永久性转移到另一个URL
302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
303——建议客户访问其他URL或访问方式
304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除

4**(客户端错误类):请求包含错误语法或不能正确执行
400——客户端请求有语法错误,不能被服务器所理解
401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
HTTP 401.1 - 未授权:登录失败
&emsp;&emsp;HTTP 401.2 - 未授权:服务器配置问题导致登录失败
&emsp;&emsp;HTTP 401.3 - ACL 禁止访问资源
&emsp;&emsp;HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效ChargeTo头响应
403——禁止访问,服务器收到请求,但是拒绝提供服务
HTTP 403.1 禁止访问:禁止可执行访问
&emsp;&emsp;HTTP 403.2 - 禁止访问:禁止读访问
&emsp;&emsp;HTTP 403.3 - 禁止访问:禁止写访问
&emsp;&emsp;HTTP 403.4 - 禁止访问:要求 SSL
&emsp;&emsp;HTTP 403.5 - 禁止访问:要求 SSL 128
&emsp;&emsp;HTTP 403.6 - 禁止访问:IP 地址被拒绝
&emsp;&emsp;HTTP 403.7 - 禁止访问:要求客户证书
&emsp;&emsp;HTTP 403.8 - 禁止访问:禁止站点访问
&emsp;&emsp;HTTP 403.9 - 禁止访问:连接的用户过多
&emsp;&emsp;HTTP 403.10 - 禁止访问:配置无效
&emsp;&emsp;HTTP 403.11 - 禁止访问:密码更改
&emsp;&emsp;HTTP 403.12 - 禁止访问:映射器拒绝访问
&emsp;&emsp;HTTP 403.13 - 禁止访问:客户证书已被吊销
&emsp;&emsp;HTTP 403.15 - 禁止访问:客户访问许可过多
&emsp;&emsp;HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。

5**(服务端错误类):服务器不能正确执行一个正确的请求
HTTP 500 - 服务器遇到错误,无法完成请求
&emsp;&emsp;HTTP 500.100 - 内部服务器错误 - ASP 错误
&emsp;&emsp;HTTP 500-11 服务器关闭
&emsp;&emsp;HTTP 500-12 应用程序重新启动
&emsp;&emsp;HTTP 500-13 - 服务器太忙
&emsp;&emsp;HTTP 500-14 - 应用程序无效
&emsp;&emsp;HTTP 500-15 - 不允许请求 global.asa
&emsp;&emsp;Error 501 - 未实现
HTTP 502 - 网关错误
HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常

64. Что происходило в процессе страницы от ввода URL до загрузки и отображения страницы? (Чем подробнее процесс, тем лучше)

Эксперты могут свободно играть в соответствии со своими областями знаний, от спецификации URL, протокола HTTP, DNS, CDN, запросов к базе данных, Для синтаксического анализа потоковой передачи в браузере, построения правил CSS, макета, рисования, загрузки/дома, выполнения JS, привязки JS API и т. д.;

详细版:
1、浏览器会开启一个线程来处理这个请求,对 URL 分析判断如果是 http 协议就按照 Web 方式来处理;
2、调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法;
  3、通过DNS解析获取网址的IP地址,设置 UA 等信息发出第二个GET请求;
4、进行HTTP协议会话,客户端发送报头(请求报头);
  5、进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器;
  6、进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理;
7、处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304;
  8、浏览器开始下载html文档(响应报头,状态码200),同时使用缓存;
  9、文档树建立,根据标记请求所需指定MIME类型的文件(比如css、js),同时设置了cookie;
  10、页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成。

65. Передовые обучающие ресурсы

js секретный сад Анализ принципа jQuery css3 стандарт js

66. Проверка электронной почты

var pattern = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/;

Ссылка на ссылку

67. Принцип реализации Ajax и использование методов

readyState属性有五个状态值。

0:是uninitialized,未初始化。已经创建了XMLHttpRequest对象但是未初始化。
1:是loading.已经开始准备好要发送了。
2:已经发送,但是还没有收到响应。
3:正在接受响应,但是还不完整。
4:接受响应完毕。
responseText:服务器返回的响应文本。只有当readyState>=3的时候才有值,根据readyState的状态值,可以知道,当readyState=3,返回的响应文本不完整,只有readyState=4,完全返回,才能接受全部的响应文本。

responseXML:response  as Dom Document object。响应信息是xml,可以解析为Dom对象。
status:服务器的Http状态码,若是200,则表示OK,404,表示为未找到。
statusText:服务器http状态码的文本。比如OK,Not Found。

Ссылка на ссылку

68. js реализует наследование

Ссылка на ссылку

69. Реализация асинхронности es7 с генераторами


70. Плюсы и минусы использования замыканий

Преимущества: 1. Защитить безопасность переменных внутри функции и усилить инкапсуляцию 2. Сохраняйте переменную в памяти 3. Спроектируйте приватные методы и переменные 4. Вы можете прочитать переменные внутри функции Недостатки: 1. Вызывает утечку памяти, неправильное использование приведет к дополнительному использованию памяти. 2. Вы можете изменить переменные родительской функции, поэтому будьте осторожны при ее использовании

71. Разница между холстом и svg

1. В отличие от категории изображений, Canvas представляет собой растровое изображение на основе пикселей, а SVG основано на векторной графике. Вы можете просто думать о разнице между ними как о разнице между фотошопом и иллюстратором. 2. Конструктивно Canvas не имеет понятия слоев, и все модификации всего холста должны перерисовываться, в то время как SVG может модифицировать отдельные теги. 3. Что касается объектов операций, Canvas основан на теге холста HTML и управляет всем холстом через API Javascript, предоставляемый хостом, в то время как SVG основан на элементах XML. 4. С точки зрения функциональности дата выпуска SVG более ранняя, поэтому функция относительно завершена по сравнению с Canvas. 5. Что касается анимации, Canvas больше подходит для растровой анимации, а SVG — для отображения диаграмм. 6. С точки зрения поисковых систем, поскольку svg состоит из большого количества тегов, к тегам можно добавлять атрибуты для облегчения поиска поисковыми роботами.

72. Включить аппаратное ускорение

//目前,像Chrome/Filefox/Safari/IE9+以及最新版本Opera都支持硬件加速,当检测到某个DOM元素应用了某些CSS规则时就会自动开启,从而解决页面闪白,保证动画流畅。
.css {
    -webkit-transform: translate3d(0,0,0);
    -moz-transform: translate3d(0,0,0);
    -ms-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

73. Примечания к кнопкам

<button></button>元素一定要写上type属性不然会默认提交表单,出现想不到的bug

74. Несколько оптимизаций опыта для мобильных HTML-тегов.

html,body{

overflow: hidden;/*手机上写overflow-x:hidden;会有兼容性问题,如果子级如果是绝对定位有运动到屏幕外的话ios7系统会出现留白*/

-webkit-overflow-scrolling:touch;/*流畅滚动,ios7下会有滑一下滑不动的情况,所以需要写上*/

position:realtive;/*直接子级如果是绝对定位有运动到屏幕外的话,会出现留白*/
}

75. Многострочное опущение на мобильном телефоне

.overflow-hidden{
    display: box !important;
    display: -webkit-box !important;
    overflow: hidden;
    text-overflow: ellipsis;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;/*第几行出现省略号*/
    /*text-align:justify;不能和溢出隐藏的代码一起写,会有bug*/
}

76. Нажмите и удерживайте страницу в течение длительного времени, чтобы вернуться назад

.element {
    -webkit-touch-callout: none;
}

77. Изменить цвет текста подсказки в поле ввода

::-webkit-input-placeholder { /* WebKit browsers */
    color: #999; }
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
    color: #999; }
::-moz-placeholder { /* Mozilla Firefox 19+ */
    color: #999; }
:-ms-input-placeholder { /* Internet Explorer 10+ */
    color: #999; }
input:focus::-webkit-input-placeholder{ color:#999; }

78. Автовоспроизведение музыки

//JS绑定自动播放(操作window时,播放音乐)
$(window).one('touchstart', function(){
    music.play();
})

//微信下兼容处理
document.addEventListener("WeixinJSBridgeReady", function () {
    music.play();
}, false);

79. Удалите заставку с трансляцией

消除transition闪屏
.css {
    -webkit-transform-style: preserve-3d;
    -webkit-backface-visibility: hidden;
    -webkit-perspective: 1000;
}

наконец

Если в тексте есть какие-то неточности, поправьте меня. Автор запустит CMS с открытым исходным кодом за 1 день.Техническая архитектура:

  • Бэкэнд-узел+Коа+redis+JsonSchema
  • Фоновый интерфейс управления vue-cli3 + vue + ts + vuex + antd-vue + axios
  • Клиентский интерфейс react + antd + react-hooks + axios

Дизайн-идею, архитектуру и процесс внедрения системы можно узнать и обсудить в статье автора о полнофункциональной CMS.

Мы приглашаем всех учиться друг у друга и вместе исследовать границы интерфейса.

больше рекомендаций