const KEY_STATUS = 'status'; // ключ сохраняемого параметра
const step = +localStorage.getItem(KEY_STATUS);
/*
Шаги:
0 - переход на /1
1 - заполнение и клик (видимо, в переходом на новую страницу?)
2 - переход на /2
*/
if (0 === step) {
document.location.href = "http://site.ru/1";
} else if (1 === step) {
document.getElementsByName("pw")[0].value = "test";
document.getElementsByClassName("ur")[0].click();
} else if (2 === step) {
document.location.href = "http://site.ru/2";
}
localStorage.setItem(KEY_STATUS, 1 + step);
clip-path: rectangle(...)
_.merge()
в библиотеке lodash. var i; // var в отличие от let и const «всплывает» наверх
// поэтому можно записать и так.
// Это важно, т.к. изменить i могут где-то ниже в коде.
for(i=0; i<10; i++) {
setTimeout(function() { // на каждой итерации создаётся новая функция,
// которая сохраняет ссылку на переменную i
alert(i); // чтобы когда, наконец, сработает,
// вывести что там в i окажется в тот момент
}, 100); // выполнение откладывается на потом через 1/10 сек
}
i
.i
, спасибо циклу, уже выросла до значения 10
. i
на этот момент.i = 2*2*5*0x65 ;
то алёрты выведут наступающий год! canvas
img
может подтормаживать, этот код заранее генерит все кадры и после рендерит в цикле их через requestAnimationFrame()
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<svg width="960" height="500"></svg>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
<script src="https://d3js.org/topojson.v2.min.js"></script>
<script>
var svg = d3.select("svg"),
canvas = document.createElement("canvas"),
width = canvas.width = +svg.attr("width"),
height = canvas.height = +svg.attr("height"),
context = canvas.getContext("2d");
var projection = d3.geoOrthographic()
.scale(195)
.translate([width / 2, height / 2])
.precision(0.1);
var path = d3.geoPath().projection(projection);
d3.json("/mbostock/raw/4090846/world-110m.json", function(err, world) {
var data = [],
stream = canvas.captureStream(),
recorder = new MediaRecorder(stream, { mimeType: "video/webm" });
recorder.ondataavailable = function(event) {
if (event.data && event.data.size) {
data.push(event.data);
}
};
recorder.onstop = () => {
var url = URL.createObjectURL(new Blob(data, { type: "video/webm" }));
d3.selectAll("canvas, svg").remove();
d3.select("body")
.append("video")
.attr("src", url)
.attr("controls", true)
.attr("autoplay", true);
};
var background = svg.append("rect")
.attr("width", width)
.attr("height", height)
.attr("fill", "#fff");
svg.append("path")
.datum({ type: "Sphere" })
.attr("stroke", "#222")
.attr("fill", "none");
svg.append("path")
.datum(topojson.feature(world, world.objects.land))
.attr("fill", "#222")
.attr("stroke", "none");
svg.append("path")
.datum(topojson.mesh(world, world.objects.countries, function(a, b) {
return a !== b;
}))
.attr("fill", "none")
.attr("stroke", "#fff");
var queue = d3.queue(1);
d3.range(120).forEach(function(frame){
queue.defer(drawFrame, frame / 120);
});
queue.awaitAll(function(err, frames){
recorder.start();
drawFrame();
function drawFrame() {
if (frames.length) {
context.drawImage(frames.shift(), 0, 0, width, height);
requestAnimationFrame(drawFrame);
} else {
recorder.stop();
}
}
});
function drawFrame(t, cb) {
projection.rotate([360 * t]);
svg.selectAll("path").attr("d", path);
var img = new Image(),
serialized = new XMLSerializer().serializeToString(svg.node()),
url = URL.createObjectURL(new Blob([serialized], {type: "image/svg+xml"}));
img.onload = function(){
cb(null, img);
};
img.src = url;
}
});
</script>
rocket-lazy-load
можно деактивировать для определённых картинок, data-no-lazy="1"
<img src="logo.png" data-no-lazy="1" title="Лого от Артемия за килобакс" alt="">
var divContent
у вас строка текста (пусть и HTML).appendChild()
ожидает не строку текста, а HTML узел (Node) – его можно создать как у вас выше document.createElement()
.element.innerHTML = myHTML;
appendChild()
Но у вас требуется два инпута вставить, с множеством атрибутов. На чистом JS это займет несколько строк:var input = document.createElement('input');
input.type = "text";
input.placeholder = "Наименование";
input.className = "expenses-item";
newDiv.appendChild(input);
input = document.createElement('input');
input.type = "text";
input.placeholder = "Цена";
input.className = "expenses-item";
newDiv.appendChild(input);
const everyNth = (arr, n) => arr.filter((e, i) => i % n === 0);
// применение
everyNth([0, 11, 22, 33, 44, 55, 66, 77], 7) // [0, 77]
for()
:function everyNth(arr, n) {
const result = [];
for (let i=0; i<arr.length; i+=n) result.push(arr[n]);
return result;
}
for()
быстрее в 7 раз!Content-type
: вы передрали код из примера с application/x-www-form-urlencoded
, который предполагает отправку данных как в GET-параметрах: a=1&b=2&c=3
request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
php://input
$data = json_decode(file_get_contents("php://input"));
forEach()
вызывает функцию по очереди с каждым из элементов массива. В данном примере вызовется function(1), function(3), function(4), ... function(5)result
это объект, где свойствами будут встреченные цифры (как строки).result
нет, и, например, result[1]
будет поначалу undefined
. И в таком случае создаётся это свойство со значением 1
.undefined
, и оно будет увеличено на 1.Math.round()
для определения попадания в интервал:var priceProduct = 2000;
var monthlyPayment = 230;
var precision = 1e-6; // точность одна миллионная
var months = priceProduct / monthlyPayment;
var nearest = Math.round(months);
var diff = months - nearest;
if (diff > precision) months = nearest + 1; // == Math.ceil()
indexOf()
const text2 = 'You know nothing Jon Snow';
function countUniqChars(str) {
return new Set(str.split('')).size;
}
countUniqChars(text2) // 13