Это пятый день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления
Объект Location, объект URL, объект URLSearchParams
URL-адреса являются одной из инфраструктур Интернета. Браузеры предоставляют некоторые собственные объекты для управления URL-адресами.
Местоположение объекта
Location
Объекты — это нативные объекты, предоставляемые браузерами, которые предоставляют информацию, связанную с URL, и методы работы. пройти черезwindow.location
а такжеdocument.location
Недвижимость, вы можете получить этот объект.
Атрибуты
Location
Объект предоставляет следующие свойства.
-
Location.href
: весь URL-адрес. -
Location.protocol
: протокол текущего URL, включая двоеточие (:
). -
Location.host
: хозяин. Если порт не является протоколом по умолчанию80
а также433
, двоеточие (:
) и порт. -
Location.hostname
: Имя хоста, не включая порт. -
Location.port
: номер порта. -
Location.pathname
: часть URL-адреса, начинающаяся с корневого пути./
Начинать. -
Location.search
: Часть строки запроса, начинающаяся со знака вопроса.?
Начинать. -
Location.hash
: Часть строки фрагмента, начиная с#
Начинать. -
Location.username
: имя пользователя перед именем домена. -
Location.password
: пароль перед именем домена. -
Location.origin
: протокол, имя хоста и порт URL-адреса.
// 当前网址为
// http://user:passwd@www.example.com:4097/path/a.html?x=111#part1
document.location.href
// "http://user:passwd@www.example.com:4097/path/a.html?x=111#part1"
document.location.protocol
// "http:"
document.location.host
// "www.example.com:4097"
document.location.hostname
// "www.example.com"
document.location.port
// "4097"
document.location.pathname
// "/path/a.html"
document.location.search
// "?x=111"
document.location.hash
// "#part1"
document.location.username
// "user"
document.location.password
// "passwd"
document.location.origin
// "http://user:passwd@www.example.com:4097"
Среди этих свойств толькоorigin
Свойства доступны только для чтения, другие свойства доступны для записи.
Обратите внимание, что еслиLocation.href
Напишите новый URL-адрес, браузер немедленно перейдет на этот новый адрес.
// 跳转到新网址
document.location.href = 'http://www.example.com';
Эта функция часто используется для автоматической прокрутки веб-страниц к новым точкам привязки.
document.location.href = '#top';
// 等同于
document.location.hash = '#top';
переписать напрямуюlocation
, что эквивалентно написаниюhref
Атрибуты.
document.location = 'http://www.example.com';
// 等同于
document.location.href = 'http://www.example.com';
Кроме того,Location.href
Это свойство является единственным свойством, которое позволяет браузеру выполнять междоменную запись, т. е. негомологичное окно может перезаписывать другое окно (например, дочернее окно и родительское окно).Location.href
атрибут, вызывая переход URL-адреса последнего.Location
Ни одно из других свойств не разрешено для записи между доменами.
метод
(1) Location.assign()
assign
Метод принимает строку URL-адреса в качестве параметра, заставляя браузер немедленно перейти к новому URL-адресу. Если параметр не является допустимой строкой URL, будет сообщено об ошибке.
// 跳转到新的网址
document.location.assign('http://www.example.com')
(2) Местоположение.заменить()
replace
Метод принимает строку URL-адреса в качестве параметра, заставляя браузер немедленно перейти к новому URL-адресу. Если параметр не является допустимой строкой URL, будет сообщено об ошибке.
это сassign
Отличие метода в том, чтоreplace
в истории посещенных страниц браузераHistory
Удалите в нем текущий URL-адрес, то есть после использования этого метода кнопка «Назад» не может вернуться на текущую веб-страницу, что эквивалентно замене старого URL-адреса новым URL-адресом в истории просмотров. Одно из его применений заключается в том, что когда скрипт обнаруживает, что в данный момент это мобильное устройство, он сразу же переходит на мобильную версию веб-страницы.
// 跳转到新的网址
document.location.replace('http://www.example.com')
(3) Location.reload()
reload
Этот метод заставляет браузер перезагружать текущий URL-адрес, что эквивалентно нажатию кнопки обновления браузера.
Он принимает логическое значение в качестве параметра. Если параметрtrue
, браузер повторно запросит страницу с сервера, и после перезагрузки страница прокрутится до заголовка (т.scrollTop === 0
). если параметрfalse
или пустой, браузер перезагрузит страницу из локального кеша, и после перезагрузки позиция области просмотра страницы будет той же, что и до перезагрузки.
// 向服务器重新请求当前网址
window.location.reload(true);
(4) Location.toString()
toString
Метод возвращает всю строку URL, что эквивалентно чтениюLocation.href
Атрибуты.
Кодирование и декодирование URL
URL-адрес веб-страницы может содержать только допустимые символы. Юридические символы делятся на две категории.
- Метасимволы URL: точка с запятой (
;
), запятая(,
), косая черта (/
),вопросительный знак(?
),двоеточие(:
), в (@
),&
,знак равенства(=
), плюс(+
),Знак доллара($
),Хэштег(#
) - Семантические символы:
a-z
,A-Z
,0-9
, дефис (-
), подчеркивать (_
),точка(.
), восклицательный знак (!
), волнистая линия (~
),звездочка(*
),апостроф('
), круглые скобки (()
)
В дополнение к указанным выше символам, другие символы в URL-адресе должны быть экранированы.Правило состоит в том, чтобы преобразовать каждый байт в знак процента (%
) плюс две заглавные шестнадцатеричные буквы.
Например, в операционных системах UTF-8http://www.example.com/q=春节
В этом URL-адресе китайский иероглиф «Весенний фестиваль» не является допустимым символом URL-адреса, поэтому он автоматически преобразуется браузером вhttp://www.example.com/q=%E6%98%A5%E8%8A%82
. Среди них «весна» стала%E6%98%A5
, "раздел" превращается в%E8%8A%82
. Это связано с тем, что кодировка UTF-8 для «весны» и «раздела» соответственноE6 98 A5
а такжеE8 8A 82
, префикс каждого байта со знаком процента представляет собой кодировку URL.
JavaScript предоставляет четыре метода кодирования/декодирования URL.
encodeURI()
encodeURIComponent()
decodeURI()
decodeURIComponent()
encodeURI()
encodeURI()
метод используется для перекодирования всего URL-адреса. Его аргументом является строка, представляющая весь URL-адрес. Он экранирует все символы, кроме метасимволов и семантических символов.
encodeURI('http://www.example.com/q=春节')
// "http://www.example.com/q=%E6%98%A5%E8%8A%82"
encodeURIComponent()
encodeURIComponent()
Метод используется для перекодирования компонентов URL, при котором будут перекодированы все символы, кроме семантических, т.е. метасимволы также будут перекодированы. Поэтому его нельзя использовать для перекодирования всего URL-адреса. Он принимает один параметр, который является фрагментом URL-адреса.
encodeURIComponent('春节')
// "%E6%98%A5%E8%8A%82"
encodeURIComponent('http://www.example.com/q=春节')
// "http%3A%2F%2Fwww.example.com%2Fq%3D%E6%98%A5%E8%8A%82"
В приведенном выше кодеencodeURIComponent()
Уйдет вместе с метасимволами URL-адреса, поэтому вы получите сообщение об ошибке, если перекодируете весь URL-адрес.
decodeURI()
decodeURI()
метод декодирования всего URL. этоencodeURI()
Обратный метод. Он принимает один параметр — перекодированный URL.
decodeURI('http://www.example.com/q=%E6%98%A5%E8%8A%82')
// "http://www.example.com/q=春节"
decodeURIComponent()
decodeURIComponent()
Используется для декодирования фрагментов URL. этоencodeURIComponent()
Обратный метод. Он принимает один параметр — перекодированный фрагмент URL.
decodeURIComponent('%E6%98%A5%E8%8A%82')
// "春节"
URL-интерфейс
Браузер изначально предоставляетURL()
Интерфейс, представляющий собой функцию-конструктор, которая создает, анализирует и кодирует URL-адреса. Как правило, поwindow.URL
Вы можете получить этот конструктор.
Конструктор
URL()
В качестве конструктора может быть сгенерирован экземпляр URL. Он принимает строку, представляющую URL-адрес, в качестве параметра. Если параметр не является допустимым URL, будет сообщено об ошибке.
var url = new URL('http://www.example.com/index.html');
url.href
// "http://www.example.com/index.html"
В приведенном выше примере создается экземпляр URL-адреса для представления указанного URL-адреса.
Кроме струн,URL()
Параметр также может быть другим экземпляром URL. В настоящее время,URL()
автоматически прочитает экземплярhref
свойство, как фактический параметр.
Если строка URL является относительным путем, то в качестве основы для расчета требуется второй параметр, представляющий абсолютный путь.
var url1 = new URL('index.html', 'http://example.com');
url1.href
// "http://example.com/index.html"
var url2 = new URL('page2.html', 'http://example.com/page1.html');
url2.href
// "http://example.com/page2.html"
var url3 = new URL('..', 'http://example.com/a/b.html')
url3.href
// "http://example.com/"
В приведенном выше коде путь возвращаемого экземпляра URL-адреса получается путем переключения на первый параметр на основе второго параметра. В последнем примере первый параметр..
, который представляет путь верхнего уровня.
свойства экземпляра
Свойства экземпляра URL такие же, какLocation
Свойства объекта в основном такие же, и возвращается информация о текущем URL-адресе.
- URL.href: возвращает полный URL
- URL.protocol: возвращает протокол с двоеточием.
:
конец - URL.hostname: возвращает доменное имя
- URL.host: возвращает имя домена и порт, включая
:
номер, порты по умолчанию 80 и 443 будут опущены - URL.port: обратный порт
- URL.origin: возвращает протокол, доменное имя и порт.
- URL.pathname: возвращает путь, начинающийся с косой черты.
/
начало - URL.search: возвращает строку запроса, начинающуюся со знака вопроса.
?
начало - URL.searchParams: возвращает
URLSearchParams
например, свойствоLocation
объект не имеет - URL.hash: возвращает идентификатор фрагмента, за которым следует знак решетки.
#
начало - URL.password: возвращает пароль перед именем домена.
- URL.username: возвращает имя пользователя перед именем домена.
var url = new URL('http://user:passwd@www.example.com:4097/path/a.html?x=111#part1');
url.href
// "http://user:passwd@www.example.com:4097/path/a.html?x=111#part1"
url.protocol
// "http:"
url.hostname
// "www.example.com"
url.host
// "www.example.com:4097"
url.port
// "4097"
url.origin
// "http://www.example.com:4097"
url.pathname
// "/path/a.html"
url.search
// "?x=111"
url.searchParams
// URLSearchParams {}
url.hash
// "#part1"
url.password
// "passwd"
url.username
// "user"
Среди этих свойств толькоorigin
Свойства доступны только для чтения, другие свойства доступны для записи и вступают в силу немедленно.
var url = new URL('http://example.com/index.html#part1');
url.pathname = 'index2.html';
url.href // "http://example.com/index2.html#part1"
url.hash = '#part2';
url.href // "http://example.com/index2.html#part2"
В приведенном выше коде измените экземпляр URLpathname
свойства иhash
свойства, будут отражены в экземпляре URL в режиме реального времени.
статический метод
(1) URL.createObjectURL()
URL.createObjectURL()
Метод используется для генерации строки URL для загруженных/скачанных файлов, файлов потокового мультимедиа. Эта строка представляетFile
объект илиBlob
URL-адрес объекта.
// HTML 代码如下
// <div id="display"/>
// <input
// type="file"
// id="fileElem"
// multiple
// accept="image/*"
// onchange="handleFiles(this.files)"
// >
var div = document.getElementById('display');
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var img = document.createElement('img');
img.src = window.URL.createObjectURL(files[i]);
div.appendChild(img);
}
}
В приведенном выше кодеURL.createObjectURL()
метод используется для создания строки URL-адреса для загруженного файла в виде<img>
Источник изображения для элемента.
URL-адрес, сгенерированный этим методом, выглядит следующим образом.
blob:http://localhost/c745ef73-ece9-46da-8f66-ebes574789b1
Обратите внимание, что каждый раз, когда вы используетеURL.createObjectURL()
метод, создаст экземпляр URL в памяти. Если строка URL, сгенерированная этим методом, больше не нужна, для экономии памяти можно использоватьURL.revokeObjectURL()
метод освобождает этот экземпляр.
(2) URL.revokeObjectURL()
URL.revokeObjectURL()
способ освободитьURL.createObjectURL()
Экземпляр URL, сгенерированный методом. Его параметрыURL.createObjectURL()
Строка URL, возвращаемая методом.
Следующее добавляет к примеру из предыдущего абзацаURL.revokeObjectURL()
.
var div = document.getElementById('display');
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var img = document.createElement('img');
img.src = window.URL.createObjectURL(files[i]);
div.appendChild(img);
img.onload = function() {
window.URL.revokeObjectURL(this.src);
}
}
}
В приведенном выше коде после успешной загрузки изображения строка URL, сгенерированная для локального файла, становится бесполезной, поэтому ее можно использовать вimg.onload
Внутри функции обратного вызова передайтеURL.revokeObjectURL()
метод для выгрузки этого экземпляра URL.
Объект URLSearchParams
Обзор
URLSearchParams
Объекты — это собственные объекты браузера, используемые для построения, анализа и обработки строки запроса URL-адреса (то есть части URL-адреса после вопросительного знака).
Он также является конструктором и может генерировать экземпляры. Параметр может быть строкой запроса, начинающейся со знака вопроса.?
Это может быть либо массив, либо объект, соответствующий строке запроса.
// 方法一:传入字符串
var params = new URLSearchParams('?foo=1&bar=2');
// 等同于
var params = new URLSearchParams(document.location.search);
// 方法二:传入数组
var params = new URLSearchParams([['foo', 1], ['bar', 2]]);
// 方法三:传入对象
var params = new URLSearchParams({'foo' : 1 , 'bar' : 2});
URLSearchParams
Строка запроса автоматически кодируется.
var params = new URLSearchParams({'foo': '你好'});
params.toString() // "foo=%E4%BD%A0%E5%A5%BD"
В приведенном выше кодеfoo
Значение - китайские иероглифы,URLSearchParams
Он автоматически кодируется в URL.
Когда браузер отправляет данные формы на сервер, их можно использовать напрямую.URLSearchParams
instance как данные формы.
const params = new URLSearchParams({foo: 1, bar: 2});
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
В приведенном выше кодеfetch
При отправке команд на сервер вы можете напрямую использоватьURLSearchParams
пример.
URLSearchParams
С участиемURL()
Интерфейсы используются в комбинации.
var url = new URL(window.location);
var foo = url.searchParams.get('foo') || 'somedefault';
В приведенном выше коде экземпляр URLsearchParams
собственность - этоURLSearchParams
например, так что вы можете использоватьURLSearchParams
интерфейсget
метод.
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
for (var p of params) {
console.log(p[0] + ': ' + p[1]);
}
// foo: 1
// bar: 2
URLSearchParams
Нет свойств экземпляра, только методы экземпляра.
URLSearchParams.toString()
toString
Метод возвращает строковую форму экземпляра.
var url = new URL('https://example.com?foo=1&bar=2');
var params = new URLSearchParams(url.search);
params.toString() // "foo=1&bar=2'
Затем, когда потребуется строка, она будет автоматически вызванаtoString
метод.
var params = new URLSearchParams({version: 2.0});
window.location.href = location.pathname + '?' + params;
В приведенном выше кодеlocation.href
При назначении вы можете напрямую использоватьparams
объект. Это автоматически вызоветtoString
метод.
URLSearchParams.append()
append()
метод используется для добавления параметра запроса. Он принимает два параметра, первый — имя ключа, второй — значение ключа, и возвращаемого значения нет.
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.append('baz', 3);
params.toString() // "foo=1&bar=2&baz=3"
append()
Метод не распознает, существует ли уже имя ключа.
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.append('foo', 3);
params.toString() // "foo=1&bar=2&foo=3"
В приведенном выше коде в строке запросаfoo
уже существует, ноappend
Ключ с тем же именем по-прежнему добавляется.
URLSearchParams.delete()
delete()
Метод используется для удаления указанного параметра запроса. Он принимает имя ключа в качестве параметра.
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.delete('bar');
params.toString() // "foo=1"
URLSearchParams.has()
has()
Метод возвращает логическое значение, указывающее, содержит ли строка запроса указанное имя ключа.
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.has('bar') // true
params.has('baz') // false
URLSearchParams.set()
set()
Метод используется для установки значения ключа строки запроса.
Он принимает два параметра: первый — это имя ключа, а второй — значение ключа. Если это существующий ключ, значение ключа будет перезаписано, в противном случае оно будет добавлено.
var params = new URLSearchParams('?foo=1');
params.set('foo', 2);
params.toString() // "foo=2"
params.set('bar', 3);
params.toString() // "foo=2&bar=3"
В приведенном выше кодеfoo
существующий ключ,bar
это ключ, который еще не существует.
Если есть несколько ключей с одинаковым именем,set
Все существующие ключи будут удалены.
var params = new URLSearchParams('?foo=1&foo=2');
params.set('foo', 3);
params.toString() // "foo=3"
Ниже приведен пример замены текущего URL.
// URL: https://example.com?version=1.0
var params = new URLSearchParams(location.search.slice(1));
params.set('version', '2.0');
window.history.replaceState({}, '', location.pathname + `?` + params);
// URL: https://example.com?version=2.0
URLSearchParams.get(), URLSearchParams.getAll()
get()
Метод используется для чтения указанного ключа в строке запроса. Он принимает имя ключа в качестве параметра.
var params = new URLSearchParams('?foo=1');
params.get('foo') // "1"
params.get('bar') // null
Два места требуют внимания. Во-первых, он возвращает строку. Если исходное значение является числовым значением, вам нужно преобразовать тип; во-вторых, если указанное имя ключа не существует, возвращаемое значениеnull
.
Если есть несколько ключей с одинаковым именем,get
Возвращает значение ключа в верхней части позиции.
var params = new URLSearchParams('?foo=3&foo=2&foo=1');
params.get('foo') // "3"
В приведенном выше коде строка запроса имеет триfoo
ключ,get
Метод возвращает первое значение ключа3
.
getAll()
Метод возвращает массив, членами которого являются все значения ключа для указанного ключа. Он принимает имя ключа в качестве параметра.
var params = new URLSearchParams('?foo=1&foo=2');
params.getAll('foo') // ["1", "2"]
В приведенном выше коде строка запроса имеет дваfoo
ключ,getAll
Возвращаемый массив состоит из двух элементов.
URLSearchParams.sort()
sort()
Метод сортирует ключи в строке запроса в соответствии с кодовой точкой Unicode от наименьшего к наибольшему.
Метод не имеет возвращаемого значения, или возвращаемое значениеundefined
.
var params = new URLSearchParams('c=4&a=2&b=3&a=1');
params.sort();
params.toString() // "a=2&a=1&b=3&c=4"
В приведенном выше коде, если есть два ключа с одинаковым именемa
, они не сортируются, но сохраняется первоначальный порядок.
URLSearchParams.keys(), URLSearchParams.values(), URLSearchParams.entries()
Все три метода возвращают объект итератора дляfor...of
Переберите. Разница между ними в том, чтоkeys
Метод возвращает итератор имен ключей,values
Метод возвращает итератор значения ключа,entries
Возвращает итератор пар ключ-значение.
var params = new URLSearchParams('a=1&b=2');
for(var p of params.keys()) {
console.log(p);
}
// a
// b
for(var p of params.values()) {
console.log(p);
}
// 1
// 2
for(var p of params.entries()) {
console.log(p);
}
// ["a", "1"]
// ["b", "2"]
если напрямуюURLSearchParams
Для обхода, по сути, внутренний вызовentries
интерфейс.
for (var p of params) {}
// 等同于
for (var p of params.entries()) {}