JavaScript. Подробное руководство, 6-е издание, стр. 287
Хотя при наличии поддержки заголовка «CORS» не требуется предпринимать какие-то дополнительные шаги для выполнения междоменных запросов, тем не менее имеются некоторые детали, касающиеся безопасности, которые желательно понимать. Во-первых, при передаче имени пользователя и пароля методу
<b>open()</b><b>XMLHttpRequest</b><b>send()</b><b>withCredentials</b><b>XMLHttpRequest</b><b>withCredentials</b>В примере 18.13 приводится ненавязчивый JavaScript-код, использующий объект
<b>XMLHttpRequest</b><b><а>.</b>Пример 18.13. Получение информации о ссылках с помощью HEAD-запросов при наличии поддержки заголовка «CORS»
<b>/**</b><b>* linkdetails.js</b><b>*</b><b>* Этот модуль в стиле ненавязчивого JavaScript отыскивает все элементы <а></b><b>* с атрибутом href и без атрибута title, и добавляет в них обработчики</b><b>* события onmouseover. Обработчик события выполняет HEAD-запрос с помощью</b><b>* объекта XMLHttpRequest, чтобы получить сведения о ресурсе, на который</b><b>* указывает ссылка, и сохраняет эту информацию в атрибуте title ссылки,</b><b>* благодаря чему эта информация будет отображаться во всплывающей подсказке.</b><b>*/</b><b>whenReady(function() {</b><b> // Поддерживается ли возможность выполнения междоменных запросов?</b><b> var supportsCORS = (new XMLHttpRequest()).withCredentials !== undefined;</b><b> // Обойти в цикле все ссылки в документе</b><b> var links = document.getElementsByTagName('a');</b><b> for(var і = 0; і < links.length; і++) {</b><b> var link = links[і];</b><b> if (!link.href) continue; // Пропустить якоря, не являющиеся ссылками</b><b> if (link.title) continue; // Пропустить ссылки с атрибутом title</b><b> // Если это междоменная ссылка</b><b> if (link.host!==location.host || link.protocol !== location.protocol)</b><b> {</b><b> link.title = "Ссылка на другой сайт"; // Предполагается, что нельзя</b><b> // получить дополнительную информацию</b><b> if (!supportsCORS) continue; // Пропустить, если заголовок</b><b> // C0RS не поддерживается</b><b> // Иначе есть надежда получить больше сведений о ссылке. Поэтому регистрируем</b><b> // обработчик события, который предпримет попытку сделать это.</b><b> }</b><b> // Зарегистрировать обработчик события, который получит сведения</b><b> // о ссылке при наведении на нее указателя мыши</b><b> if (link.addEventListener)</b><b> link.addEventListener("mouseover", mouseoverHandler, false);</b><b> else</b><b> link.attachEvent("onmouseover", mouseoverHandler);</b><b> }</b><b> function mouseoverHandler(e) {</b><b> var link = e.target || e.srcElement; // Элемент <a></b><b> var url = link, liref; // URL-адрес ссылки</b><b> var req = new XMLHttpRequest(); // Новый запрос</b><b> req.open("HEAD", url); // Запросить только заголовки</b><b> req.onreadystatechange = function() { // Обработчик события</b><b> if (req.readyState !== 4) return; // Игнорировать незаверш. запросы</b><b> if (req.status === 200) { // В случае успеха</b><b> var type = req.getResponseHeader("Content-Type"); //Получить</b><b> var size = req.getResponseHeader("Content-Length"); //сведения</b><b> var date = req.getResponseHeader("Last-Modified"); //о ссылке</b>