&code=xxxxx
, который уже мой сервер обменивает напрямую с соц.сетью на токен.postMessage()
в родительское окно с основным приложением – сообщит о результате: получено разрешение или пользователь что-то накосячил или передумал;.food-item-*
(может, у них у всех есть какой-то общий класс?) или document.querySelectorAll('[class^=.food-item-]')
.food-item-NNN-bin
(регуляркой) и выдирать оттуда число.Progressive Advancement has won the game for now as far as I can see. If UI/UX designers start a product design with its desktop version, they will inevitably want to make use of most of the advantages of the advanced end. For example, the hover effect which is supported by a cursor mouse; HD images & complex charts which can display normally only when there is a recent bandwidth. In this way, the designers will make efforts to complete an amazing desktop version and only to find it can hardly be adopted on a mobile end unless they give up a lot of beautiful ideas. If so, the mobile end version will be more like an afterthought, an incomplete product which’s been watered down.
active
для единственного выбранного элемента:div.answer { background: #222; color: #aeaeae; }
div.answer.active { background: #fff; color: #000; }
const els = [...document.querySelectorAll('.answer')];
const toggle = event => {
els.forEach(el => el.classList[event.target === el ? 'add' : 'remove']('active'));
}
els.forEach(el => el.addEventListener('click', toggle));
var a = getRectArea( 3, 4 );
a
окажется значение, которое функция вернула – то, что после "return" в ней оказалось. В вашем примере это 3 * 4, т.е. число 12. Ура, в переменной a
теперь лежит число 12
function test() {
return;
alert('Привет мир!'); // эта строка никогда не выполнится
}
gtag()
с искомым событием. И там же дописать ваш alert()
gtag()
свою функцию, например, mytag()
которая, в свою очередь, станет вызывать gtag()
и может, другие скрипты аналитики.gtag()
В таком случае остаётся заменить функцию gtag()
на свою: function gtag(){
dataLayer.push(arguments); // это весь исходный её функционал
if (arguments.length > 1
&& typeof arguments[0] === 'string'
&& arguments[0].toLowerString() === 'event'
&& typeof arguments[1] === 'string'
&& arguments[1] === 'name1'
)
{
alert("Name 1!");
}
}
position
– где-то далеко слева, его не видно, а значение position
отрицательное. Ноль соответствует точно левому краю, началу видимой «платформы».prev
– толпа смайликов едет вправо, её position
увеличивается. Но при этом последний вагон не должен уехать правее левого края платформы. Поэтому position
(обычно отрицательный) делается равным наибольшему из двух: 0
или вычисленному значению. Если «уехали», position
получился положительным. И Math.min(0, position)
станет равным 0
.position
не должен становиться левее == меньше, чем минус-длина поезда плюс длина платформы. 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>