Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Основные факты:
• Программы на JS хранятся в виде исходного текста.
• Большая часть синтаксиса JS пришла по наследию из
языка C.
• JS – прототипно-ориентированный (об этом чуть
позже), нестроготипизированный, интерпретируемый.
• В основном используется в браузерах (или иных
клиентах), но существует и серверная реализация.
JS
Работа на Работа на
«Экзотическое
стороне стороне
использование»
клиента сервера
<span id="sample"></span>
</body>
</html>
window.onload=function(){document.getElementById('sample').innerHTML='Hi again!';};
<script>
alert('OK');
}
</script>
2014 © EPAM Systems, RD Dep. 15
Комментарии в JavaScript
x=9; // комментарий
/*
и это тоже комментарий
*/
<script>
var1 = 'A';
vAr1 = 'B';
alert(var1+vAr1);
</script>
ВАЖНО!
var someVariable;
var newVariable15;
var $ = 15;
var _ = 17;
var someVariable;
var newVariable15;
var $ = 15;
var _ = 17;
a = true; // Не TRUE
b = false; // Не FALSE
a = 0.1;
b = 0.2;
c = a + b; // 0.30000000000000004
Math.round(число) округляет
число до целых.
a = "Text";
b = a.length; // 4
c = "Lalala".length; // 6
d = '\u1553'; // "ᕓ"
e = d.length; // 1
var x;
if (x == undefined)
{
// Какой-то код .
}
if (b == undefined)
{
console.log('b is undefined');
}
if (c == null)
{
console.log('c is null');
}
if (c == undefined)
{
console.log('c is undefined');
}
console.log(someObject.name);
console.log(someObject.price);
console.log(someObject.getPrice());
Рассмотрим на примере…
console.log(names[1]);
console.log(names.length);
console.log(names[555]);
console.log(names[0]);
console.log(names[1][1]);
console.log(names[1][999]);
console.log(fnc()[1]);
console.log(typeof(fnc));
fnc();
const a = 99;
console.log(a);
99
Пример использования:
console.log(typeof 37); // number
console.log(typeof 3.14); // number
console.log(typeof Math.LN2); // number
console.log(typeof Infinity); // number
console.log(typeof NaN); // number (хоть Nan -- это и Not-A-Number)
console.log(typeof Number(1)); // number
false true
false true
0 Непустая строка
0.0 +/- Infinity
NaN
Всё остальное,
Пустая строка что не
null перечислено
слева.
undefined
false 0
См. далее . См. далее .
true 1
var b = true;
parseInt(b); // NaN
“undefined”
2014 © EPAM Systems, RD Dep. 53
Преобразование к Array
Массив соответствующего
Ошибка создания
размера с undefined
массива.
элементами.
2014 © EPAM Systems, RD Dep. 54
Преобразование к Array
var i = 2;
var d = 55.5;
var dt = new Date();
var obj = new Object;
obj.x = 100;
obj.y = 200;
var n = null;
var u;
Переменная остаётся
Пустой объект.
функцией.
Объект с нумерованными и
https://
свойствами (символами developer.mozilla.org/en-US/docs/Web/Java
строки). Script/Reference/Global_Objects/String
Преобразование Переключение
a = 10; a = 10;
a = String(a); b = true;
c = a + b;
undefi
true false 1 0 -1 1 0 -1 null Array() str ""
ned
true true false true false false true false false false false false false false
false false true false true false false true false false true false true false
1 true false true false false true false false false false false false false
0 false true false true false false true false false true false true false
-1 false false false false true false false true false false false false false
1 true false true false false true false false false false false false false
0 false true false true false false true false false false false false false
-1 false false false false true false false true false false false false false
null false false false false false false false false true false false false true
Array() false true false true false false false false false true false true false
str false false false false false false false false false false true false false
"" false true false true false false false false false true false true false
undefi
false false false false false false false false true false false false true
ned
undefi
true false 1 0 -1 1 0 -1 null Array() str ""
ned
true true false false false false false false false false false false false false
false false true false false false false false false false false false false false
1 false false true false false false false false false false false false false
0 false false false true false false false false false false false false false
-1 false false false false true false false false false false false false false
1 false false false false false true false false false false false false false
0 false false false false false false true false false false false false false
-1 false false false false false false false true false false false false false
null false false false false false false false false true false false false false
Array() false false false false false false false false false true false false false
str false false false false false false false false false false true false false
"" false false false false false false false false false false false true false
undefi
false false false false false false false false false false false false true
ned
Вариант 1: Вариант 2:
a="10 cats"; a="10 cats";
b="5a dogs"; b='5a dogs';
c=a/b; c=a/b;
NaN NaN
Вариант 3:
a=true;
b="5a dogs";
c=a/b;
NaN
2014 © EPAM Systems, RD Dep. 61
ОСНОВНЫЕ ФУНКЦИИ
JAVASCRIPT, С КОТОРЫХ
НАДО НАЧАТЬ
<?php <script>
echo $var; // ???
print_r($var); </script>
isset($arr[$elem]);
unset($var, $arr[$elem]);
include($filename);
exit(‘Some message…’);
?>
В PHP аналогичный
эффект дают
функции print_r() и
var_dump().
2014 © EPAM Systems, RD Dep. 65
Проверка существования
b is null
c is undefined
2014 © EPAM Systems, RD Dep. 66
Проверка существования
obj.y is undefined
ReferenceError: zzz is not defined
arr.splice(3, 1);
console.log(arr); // [100, 200, 300, 500]
delete arr[2];
console.log(arr); // [100, 200, undefined, 500]
function Fnc(){};
Fnc.prototype = { x: 123 };
var example = new Fnc();
console.log(example.x); // 123
example.x = 456;
console.log(example.x); // 456
delete example.x;
console.log(example.x); // 123 (обращение к родительскому свойству)
z = 555;
delete z;
console.log(z); // 555 (не удаляется; особенно это относится к объявлению с var)
z = undefined;
console.log(z); // undefined
fnc();
// Остановка скрипта.
throw new Error('Script terminated');
console.log('Step 3');
console.log(fnc());
First
Second
2014 © EPAM Systems, RD Dep. 70
Несколько очень простых примеров…
Итак…
console.log(getRandomDouble(100, 200));
console.log(getRandomInteger(100, 200));
150.1573960629088
145
</head>
<body onload="makeCellsGreen()">
<div id="sample"></div>
<table>
<tr>
<td> </td>
</tr>
<tr>
<td><a href="#">Link</a></td>
</tr>
</table>
</body>
</html> См. пример в файле 01_js_samples_misc\04_scan_all_elements.html
2014 © EPAM Systems, RD Dep. 74
ОПЕРАТОРЫ И
УПРАВЛЯЮЩИЕ
КОНСТРУКЦИИ JAVASCRIPT
• delete
• function
• in
• instanceof
• new
• this
• typeof
• void
• Аксессоры: object.property и object["property"]
• Арифметические: +, -, *, /, %, ++, --
• Запятая: ,
• Логические: &&, ||, !
• Присваивания: =, +=, -=, *=, /=, >>=, <<=, >>>=, &=, |=, ^=
• Сравнения: ==, !=, ===, !==, >, >=, <, <=
• Побитовые: &, |, ^, ~, <<, >>, >>>
• Строковые: +, +=
• Условный: condition ? ifTrue : ifFalse
2014 © EPAM Systems, RD Dep. 78
Выражения с несколькими операторами
А в PHP – 10.
// 8
i=2;
i += i++ + ++i;
console.log(i);
1. i == 2;
2. Срабатывает префиксный инкремент ++i, выражение принимает вид:
3. i += i++ + 3;
4. Происходит подстановка закэшированного значения, выражение
принимает вид:
5. i += 2 + 3; или: i += 5;
6. Происходит «разворачивание» «сокращённой записи сложения и
присваивания» +=, выражение принимает вид:
7. i=2 + 5;
8. Выполнение выражения (п. 4) даёт i == 7;
9. Срабатывает постфиксный инкремент i++, который увеличивает
значение i на единицу, т.е. теперь i == 8;
Оператор Действие
c= !a; Логическое отрицание (NOT)
c=a && b; Логическое И (AND)
c=a || b; Логическое ИЛИ (OR)
a = 'Hello';
a += ' world!';
console.log(a);
Hello world!
Hello world!
2014 © EPAM Systems, RD Dep. 89
Оператор «запятая»
arr.a = 12345;
arr[b] = 67890;
obj.x = 11111;
// obj[y] = 33333; // Так нельзя, это не элемент массива.
console.log(arr.a); // 12345
console.log(arr[a]); // undefined
console.log(arr.b); // undefined
console.log(arr[b]); // 67890
// console.log(obj[x]); // Так нельзя, это не элемент массива.
console.log(obj.y); // 222
delete arr[1];
with(obj)
{
delete y; // true (эквивалент delete obj.y).
}
void(someCode);
console.log(x); // 1
eval(someCode);
console.log(x); // 999
x = 10;
y = 20;
if ((x == 10)&&(y==20))
{
console.log("Десять и двадцать.");
}
i = 0;
do
{
console.log(i);
}
while (++i <= 5);
x = 10;
y = (x == 10) ? "Десять" : "Не десять";
Math.round(55.7777); // 56
Math.floor(55.7777); // 55
Math.ceil(55.7777); // 56
console.log(Math.random());
x = 255;
hexString = x.toString(16);
console.log(hexString); // ff
function getMaxOfArray(numArray)
{
return Math.max.apply(null, numArray);
}
console.log(isFinite(x)); // false
console.log(isFinite(y)); // false
console.log(isFinite(z)); // false
console.log(isFinite(a)); // true
console.log(isFinite(s)); // false
console.log(isNaN(x)); // false
console.log(isNaN(y)); // false
console.log(isNaN(z)); // false
console.log(isNaN(a)); // false
console.log(isNaN(s)); // true
console.log(sqr(2)); // 4
function test()
{
a = 1000;
var b = 2000;
var c = 40;
d = 50;
}
console.log(a); // 10
console.log(b); // 20
test();
console.log(a); // 1000
console.log(b); // 20
//console.log(c); // Ошибка, переменная не существует вне функции.
console.log(d); // 50
test(a, b);
console.log(a); // 10
console.log(b); // Object { z=999 }
function fnc(a, b)
{
a = typeof a !== 'undefined' ? a : 999;
b = typeof b !== 'undefined' ? b : "Test";
console.log(a, b);
}
console.log(fact(5)); // 120
JavaScript поддерживает:
• анонимные функции – функций, которые
объявляются в месте использования и не получают
уникального идентификатора для доступа к ним.
• замыкания – функции, в теле которых присутствуют
(не в качестве параметров) ссылки на переменные,
объявленные вне тела этой функции. Такие функции
ссылаются на свободные переменные в своём
контексте.
Очень полезно:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
// Использование замыкания
var add5 = makeAdder(5);
var add10 = makeAdder(10);
document.getElementById('sample').innerHTML += add5(2) + '<br>';
document.getElementById('sample').innerHTML += add10(2) + '<br>';
}
// Замыкание
function makeAdder(x)
{
return function(y)
{
return x + y;
};
}
</script>
</head>
<body onload="doIt()">
<div id="sample"></div>
</body>
</html>
fnc1: function() {
},
fnc2: function() {
}
};
...
yourNamespace.fnc1();
Почитать подробнее:
http://msdn.microsoft.com/en-us/magazine/gg578608.aspx
Случаи 1, 5, 6 являются
классическими и наиболее
рекомендуемыми.
// Иванов,Иван,Иванович Петров,Пётр,Петрович
console.log(str1);
console.log(str2); // Иванов Иван Иванович
console.log(str3); // Петров,Пётр,Петрович
arr.sort();
console.log(arr); // ["Два", "Один", "Три"]
arr.sort(compareByLengthReverse);
console.log(arr); // ["Один", "Два", "Три"]
arr.reverse();
console.log(arr); // ["Три", "Два", "Один"]
Соответственно, использование
Array.unshift()/Array.pop() и Array.push()/Array. shift(),
позволяет работать с массивом как с очередью:
var arr = Array(10, 20, 30);
console.log(arr.unshift(999)); // 4
console.log(arr); // [999, 10, 20, 30]
console.log(arr.pop()); // 30
console.log(arr); // [999, 10, 20]
console.log(arr.push(555)); // 4
console.log(arr); // [999, 10, 20, 555]
console.log(arr.shift()); // 999
console.log(arr); // [10, 20, 555]
console.log(str.split(''));
// ["Т", "е", "с", "т", "о", "в", "а", "я",
// " ", "с", "т", "р", "о", "к", "а"]
console.log(str.toUpperCase());
// ТЕСТОВАЯ СТРОКА
<a href="http://tut.by/">Tut.by</a>
<a name="contents_anchor">Table of Contents</a>
null
8
-1
Индекс: ------
Индекс: 220001
console.log(Date.now()); // 1393925189676
dt = new Date();
dt.setDate(31);
dt.setFullYear(2015);
dt.setHours(23);
dt.setMilliseconds(0);
dt.setMinutes(30);
dt.setMonth(11);
dt.setSeconds(15);
console.log(dt);
// Date {Thu Dec 31 2015 23:30:15 GMT+0300 (Kaliningrad Standard Time)}
function microLog()
{
document.getElementById('message').innerHTML += 'Вы кликнули по слову<br>';
}
</script>
elem = document.getElementById('some_id');
handler = function() {
alert('OK');
};
elem.attachEvent("onclick", handler) // Навесить обработчик.
elem.detachEvent("onclick", handler) // Снять обработчик.
Теперь – W3C-style:
Пример W3C-style:
function addHandlers()
{
var spanlist = document.getElementsByTagName("span");
for (var i=0; i<spanlist.length; i++)
{
spanlist[i].addEventListener("click", microLog, false);
function makeRed(elem)
{
return function()
{
this.style.color='red';
};
}
function makeBlack(elem)
{
return function()
{
elem.style.color='black';
};
}
function microLog()
{
document.getElementById('message').innerHTML += 'Вы кликнули по слову<br>';
}
… и сюда.
Последовательность срабатывания
обработчиков будет такой:
1) outer-catch
2) middle-catch
3) inner-bubble
4) inner-catch
5) middle-bubble
6) outer-bubble
function innerClickedBubble()
{
document.getElementById('log').innerHTML += 'inner-bubble<br>';
}
function middleClickedBubble()
{
document.getElementById('log').innerHTML += 'middle-bubble<br>';
}
function outerClickedBubble()
{
document.getElementById('log').innerHTML += 'outer-bubble<br>';
}
function innerClickedCatch()
{
document.getElementById('log').innerHTML += 'inner-catch<br>';
}
function middleClickedCatch()
{
document.getElementById('log').innerHTML += 'middle-catch<br>';
}
function outerClickedCatch()
{
document.getElementById('log').innerHTML += 'outer-catch<br>';
}
</script>
<style>
#outer {
width: 100px;
height: 100px;
border: 1px solid black;
}
#middle {
width: 75px;
height: 75px;
margin-left: 12px;
margin-top: 12px;
border: 1px solid black;
}
#inner {
width: 50px;
height: 50px;
margin-left: 12px;
margin-top: 12px;
border: 1px solid black;
}
</style>
</style>
</head>
<body onload="addHandlers()">
<div id="outer">
<div id="middle">
<div id="inner">
</div>
</div>
</div>
<div id="log"></div>
</body>
</html>
event.preventDefault();
function innerClickedBubble(event)
{
document.getElementById('log').innerHTML += 'inner-bubble<br>';
event.stopPropagation();
}
function middleClickedBubble(event)
{
document.getElementById('log').innerHTML += 'middle-bubble<br>';
event.stopPropagation();
}
function outerClickedBubble(event)
{
document.getElementById('log').innerHTML += 'outer-bubble<br>';
event.stopPropagation();
}
function innerClickedCatch(event)
{
document.getElementById('log').innerHTML += 'inner-catch<br>';
event.stopPropagation();
}
function middleClickedCatch(event)
{
document.getElementById('log').innerHTML += 'middle-catch<br>';
event.stopPropagation();
}
function outerClickedCatch(event)
{
document.getElementById('log').innerHTML += 'outer-catch<br>';
event.stopPropagation();
}
</script>
<style>
#outer {
width: 100px;
height: 100px;
border: 1px solid black;
}
#middle {
width: 75px;
height: 75px;
margin-left: 12px;
margin-top: 12px;
border: 1px solid black;
}
#inner {
width: 50px;
height: 50px;
margin-left: 12px;
margin-top: 12px;
border: 1px solid black;
}
</style>
</head>
<body onload="addHandlers()">
<div id="outer">
<div id="middle">
<div id="inner">
</div>
</div>
</div>
<div id="log"></div>
</body>
</html>
в консоль:
mozMovementY 154
mozPressure 0
multipleActionsPrevented false
getModifierState getModifierState()
initNSMouseEvent initNSMouseEvent()
<!DOCTYPE html>
<html> stopImmediatePropagation stopImmediatePropagation()
<head>
<meta charset="UTF-8"> altKey false
<title>JavaScript: устновка обработчиков событий</title>
<script> bubbles true
function addHandlers()
{ button 0
document.getElementById("inner").addEventListener("click", innerClickedBubble, false);
document.getElementById("middle").addEventListener("click", middleClickedBubble, false); cancelBubble false
document.getElementById("outer").addEventListener("click", outerClickedBubble, false);
} cancelable true
function innerClickedBubble(event) clientX 72
{
console.log(this.id); clientY 76
console.log(event);
} ctrlKey false
function middleClickedBubble(event) currentTarget div#middle
{
console.log(this.id); detail 1
console.log(event);
} eventPhase 3
function outerClickedBubble(event) explicitOriginalTarget div#inner
{
console.log(this.id); isChar false
console.log(event);
} isTrusted true
layerX 72
</script>
layerY 76
<style>
#outer { metaKey false
width: 100px;
height: 100px; originalTarget div#inner
border: 1px solid black;
} pageX 72
#middle { pageY 76
width: 75px;
height: 75px; rangeOffset 0
margin-left: 12px;
margin-top: 12px; rangeParent div#inner
border: 1px solid black;
} relatedTarget null
#inner { screenX 72
width: 50px;
height: 50px; screenY 176
margin-left: 12px;
margin-top: 12px; shiftKey false
border: 1px solid black;
} target div#inner
</style>
</head> timeStamp 703677937
<body onload="addHandlers()">
type "click"
<div id="outer">
<div id="middle"> view Window 11_events_06_event_object.html
<div id="inner">
</div> which 1
</div>
</div> getPreventDefault getPreventDefault()
<div id="log"></div> initEvent initEvent()
</body> initMouseEvent initMouseEvent()
</html>
initUIEvent initUIEvent()
preventDefault preventDefault()
stopPropagation stopPropagation()
ALT_MASK 1
AT_TARGET 2
BUBBLING_PHASE 3
CAPTURING_PHASE 1
01_js_samples_misc\11_events_06_event_object.html
SCROLL_PAGE_UP -32768
SHIFT_MASK 4
function onClickListener(event)
{
var parent_div = event.currentTarget;
var child_div = document.createElement('div');
event.stopPropagation();
parent_div.removeEventListener('click', onClickListener);
child_div.style.width = '80%';
child_div.style.height = '80%';
child_div.style.border = '1px solid black';
parent_div.appendChild(child_div);
child_div.addEventListener("click", onClickListener, false);
}
</script>
<style>
#div1 {
width: 100px;
height: 100px;
border: 1px solid black;
}
</style>
</head>
<body onload="addHandlers()">
<div id="div1">
</div>
</body>
</html>
См. пример в файле
01_js_samples_misc\12_examples_01_divs.html
2014 © EPAM Systems, RD Dep. 186
Работа с DOM в контексте событий
function makeBox(elem)
{
var clickHandler = function()
{
this.style.border='1px solid black';
this.removeEventListener('click', clickHandler);
};
return clickHandler;
}
</script>
</head>
<body onload="addHandlers()">
Покликайте по этим словам:<br>
<span>Раз.</span><br>
<span>Два.</span><br>
<span>Три.</span>
</body>
</html>
function addRow()
{
var row = document.getElementById('tbl').insertRow(0);
var cell1=row.insertCell(0);
var cell2=row.insertCell(1);
cell1.className='bordered';
cell2.className='bordered';
function startTimer()
{
document.getElementById('timer').style.display = 'block';
showTimer();
interval = setInterval(showTimer, 1000); // НЕ var interval !!!
}
function showTimer()
{
var dt = new Date();
hours = ((h = dt.getHours())<10) ? '0'+h : h;
minutes = ((m = dt.getMinutes())<10) ? '0'+m : m;
seconds = ((s = dt.getSeconds())<10) ? '0'+s : s;
document.getElementById('hour').innerHTML = hours;
document.getElementById('minute').innerHTML = minutes;
document.getElementById('second').innerHTML = seconds;
}
function stopTimer()
{
document.getElementById('timer').style.display = 'none';
clearInterval(interval);
}
</script>
<style>
.bordered {border: 1px solid black;}
</style>
</head>
<body onload='prepareTimer()'>
<div id='timer' style='display: none'>
<button onclick='stopTimer()'>Остановить таймер</button><br>
<span id='hour'></span>:<span id='minute'></span>:<span id='second'></span>
</div>
</body>
</html> См. пример в файле
01_js_samples_misc\15_timer.html
2014 © EPAM Systems, RD Dep. 193
РАБОТА С XML / JSON В
JAVASCRIPT
function updateWithJSON()
{
var tbl = document.getElementById('json_table');
if ((typeof tbl != 'undefined')&&(tbl != null))
{
tbl.parentNode.removeChild(tbl);
}
tbl = document.createElement('table');
tbl.id = 'json_table';
tbl.className = 'bordered';
var jsonDoc=JSON.parse(xmlhttp.responseText);
var rows = jsonDoc.tr;
</script>
<style>
.bordered {border: 1px solid black;}
</style>
</head>
<body>
<button onclick='loadXML()'>Обновить таблицу на основе XML</button> <button onclick='loadJSON()'>Обновить таблицу на основе JSON</button><br>
<div id='xml_table_container'></div>
<div id='json_table_container'></div>
</body>
</html>
if (typeof x == 'string')
{
// В создаваемом объекте вы можете определять ЛЮБЫЕ свойства и методы.
throw {
name: 'Type Error',
level: 'Script stop',
message: 'x must be a number',
htmlMessage: '<a href="no_manual_sorry.html">No manual available</a>',
toString: function(){return this.name + ": " + this.message}
}
}
try
{
test(-1); // Закомментируйте эту строку, чтобы увидеть реакцию на второй случай.
test('abc');
}
catch (e)
{
console.log(e);
}
Done
console.log(pupkin.make_some_work()); // Done
console.log(smith.make_good_work()); // Well done!
console.log(smith.make_some_work()); // Done
console.log(smith.profession_by_education); // worker
pupkin.profession_by_education = 'writer';
console.log(smith.profession_by_education); // writer
Creature.prototype.getName = function()
{
return this.name;
}
Creature.prototype.getType = function()
{
return this.type;
}
function Human(name)
{
Creature.call(this, name, 'human');
this.name = name || 'No name';
}
Human.prototype = Object.create(Creature.prototype);
var pupkin = new Human('Pupkin');
var smith = new Human('Smith');
console.log(pupkin.getName()); // Pupkin
console.log(pupkin.getType()); // human
console.log(smith.getName()); // Smith
console.log(smith.getType()); // human
console.log(smith instanceof Human); // true
console.log(smith instanceof Creature); // true
this.name = name;
this.type = type || 'unknown type';
}
// Обращение к конструктору
var x = new TestFunction('text'); // this == новый объект
// Вызов метода
obj.test_function('text'); // this == obj
// Вызов обработчика
<span onclick="span_click(this)"> // this == span
2014 © EPAM Systems, RD Dep. 212
ООП в JavaScript, создание объектов, наследование
// Perl-style способ:
var re = /регулярное_выражение/модификаторы;
// Классический способ:
var re_classic = new RegExp('/[a-z]+\\w/', 'i');
// Perl-style способ:
var re_perl = /[a-z]+\w/i;
console.log(re_4d.test(text)); // true
console.log(re_5d.test(text)); // false
console.log(text.search(re_4d)); // 32
console.log(text.search(re_5d)); // -1
console.log(text.replace(re_4d, '?'));
console.log(text.split(re_4d));
Задачи:
1) Определить, содержит ли текст хотя бы одно
трёхзначное число.
2) Показать все двухзначные числа, стоящие строго
в начале или строго в конце строки.
3) Для дат в формате [Д]Д.[М]М.[ГГ]ГГ выделить
день, месяц, год.
4) Выделить в тексте дублирующиеся слова.
5) Определить числа с запятой или пробелом в
качестве разделителя разрядов.
Сервер
Запрос и данные
Запрос и данные
Запрос и данные
Запрос и данные
Новая страница
Новая страница
Новая страница
Новая страница
Браузер
2014 © EPAM Systems, RD Dep. 229
Как это работает
Сервер
Запрос и данные
Запрос и данные
Запрос и данные
Порция данных
Порция данных
Порция данных
Запрос и данные
Новая страница
XMLHttpRequest
JavaScript
Браузер
2014 © EPAM Systems, RD Dep. 230
Как это реализовать
Итак…
Метод
void open(
DOMString method,
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
);
Метод
void send();
отправляет запрос и либо ждёт его завершения
(синхронный запрос), либо сразу же завершается
(асинхронный запрос).
Из других полезных методов стоит отметить:
• abort() – отмена всей операции.
• getResponseHeader(String header) – возвращает указанный
заголовок ответа или null, если заголовка нет, или он пока не
получен.
• setRequestHeader(String header, String value) – позволяет указать
заголовок HTTP-запроса.
• overrideMimeType(String mimetype) – позволяет принудительно
указать MIME-тип документа (полезно, например, если нужно
будет проанализировать XML-ответ, но сервер не выставил
правильный заголовок).
function sampleSync()
{
var xhr = getXHR();
xhr.onreadystatechange = createWatcher(xhr, 'Sync: ');
function sampleAsync()
{
var xhr = getXHR();
xhr.onreadystatechange = createWatcher(xhr, 'Async: ');
</script>
</head>
<body>
<button onclick='sampleSync()'>Синхронный запрос</button> <button onclick='sampleAsync()'>Асинхронный запрос</button><br>
<div id='log'></div>
</body>
</html>
Почитать подробнее:
http://en.wikipedia.org/wiki/Same-origin_policy
Почитать подробнее:
http://en.wikipedia.org/wiki/JSONP
Серверная часть:
<?php
if (isset($_GET['callback']))
{
// Just for security reasons.
$callback = preg_replace('/[^a-z0-9$_]/si', '', $_GET['callback']);
// Set headers.
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/javascript;charset=UTF-8');
?>
Клиентская часть:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript: JSONP</title>
<script>
function getCrossDomainData()
{
var script = document.createElement("script");
script.src = 'http://192.168.56.101/jsonp.php?callback=jsonptest';
document.body.appendChild(script);
}
function jsonptest(data)
{
console.log(data);
document.getElementById('log').innerHTML += data.a;
}
</script>
</head>
<body>
<button onclick='getCrossDomainData()'>Запросить занные</button><br>
<div id='log'></div>
</body>
</html>
ВОПРОСЫ?
Основы JavaScript