You may also pass in a matrix while instantiating the PF.Grid class. It will initiate all the nodes in the grid with the same walkability indicated by the matrix. 0 for walkable while 1 for blocked.
matrix [координата Y (номер строки)] [координата X (номер колонки)]
document.querySelector("#nav-toggle")
if ($(window).width() > 991) {
$("#nav-toggle").on("click", function() {
$(this).toggleClass("active");
});
}
var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'];
$('#sf tr').each(function () {
var $cell = $('<td>').append('<a class="add_item">Добавить в корзину</a>');
$(this).append($cell);
$(this).find('td').each(function (index, element) {
$(element).addClass(classes[index]);
});
});
var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'],
$rows = $('#sf tr').filter(':gt(0)'),
$link = $('<a>').addClass('add_item').text('Добавить в корзину'),
$cell = $('<td>').append($link),
$cells;
$rows.append($cell);
$cells = $rows.find('td');
$cells.each(function (index, cell) {
$(cell).addClass(classes[index % classes.length]);
});
На сколько я поля это фишка асинхронности !?Правильно поняли.
Это получается нужно код выстраивать цепочкой из калбэков ?Необязательно. (для nodejs, понятно, своя специфика, но общие принципы такие же, естественно).
$(document).ready(function () {
var owl = $(".sldr").owlCarousel().data('owlCarousel');
$(window).on('mousewheel', debounce(function (event) {
var direction = event.originalEvent.deltaY < 0 ? 'next' : 'prev';
owl[direction]();
}, 100));
});
function debounce(func, wait, immediate) {
var timeout, args, context, timestamp, result;
var later = function () {
var last = new Date().getTime() - timestamp;
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
if (!timeout) context = args = null;
}
}
};
return function () {
context = this;
args = arguments;
timestamp = new Date().getTime();
var callNow = immediate && !timeout;
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
}
var buttons = document.querySelectorAll('.js-btn-item'),
popups = document.querySelectorAll('.js-products-popup'),
closers = document.querySelectorAll('.js-btn-close'),
index, button, popup, closer;
for (index = 0; index < buttons.length; index++) {
button = buttons[index];
popup = popups[index];
closer = closers[index];
button.addEventListener('click', buttonHandler(popup));
closer.addEventListener('click', closerHandler(popup))
}
function buttonHandler(popup) {
return function (event) {
event.preventDefault();
popup.classList.add('js-popup-show');
}
}
function closerHandler(popup) {
return function (event) {
event.preventDefault();
popup.classList.remove('js-popup-show');
}
}
$(e).one('click', function () {
в следующий раз не вызывать эту функцию при клике на $(e)
})
updateResult(".currentItem", this.owl.currentItem);
var buttonItems = document.querySelectorAll('.button-item'),
index, button;
for (index = 0; index < buttonItems.length; index++) {
button = buttonItems[index];
button.addEventListener('click', function (event) {
console.log('click');
event.preventDefault();
});
}
var buttons = document.querySelectorAll('.button-item'),
index, button;
for (index = 0; index < buttons.length; index++) {
button = buttons[index];
button.addEventListener('click', clickHandler);
button.addEventListener('dblclick', doubleClickHandler);
}
function clickHandler(event) {
console.log('click', this.innerText);
event.preventDefault();
}
function doubleClickHandler(event) {
console.log('doubleclick', this.innerText);
this.removeEventListener('click', clickHandler);
this.removeEventListener('dblclick', doubleClickHandler);
}
one().done(two);
function one() {
var dfd = new $.Deferred();
// Запускаем асинхронную задачу. Например, ajax-запрос.
setTimeout(function () {
var foo = 'bar';
// "Выполняем обещание", передавая в него какую-то информацию.
// Передавать аргументы, разумеется, не обязательно.
dfd.resolve(foo);
}, 2000);
// Возвращаем из функции обещание, на которое могут подписаться другие функции.
// Обратите внимание, этот код выполнится до того, как завершится асинхронная задача.
return dfd.promise();
}
function two(foo) {
// Обрабатываем данные, полученные внутри асинхронной функции one.
console.log('two', foo);
}
one().then(two, onOneError).then(three, onTwoError);
function one() {
var dfd = new $.Deferred();
setTimeout(function () {
console.log('one');
if (Math.round(Math.random() * 10) >= 5)
{
dfd.resolve();
}
else
{
dfd.reject();
}
}, 1000);
return dfd.promise();
}
function two() {
var dfd = new $.Deferred();
setTimeout(function () {
console.log('two');
if (Math.round(Math.random() * 10) >= 5)
{
dfd.resolve();
}
else
{
dfd.reject();
}
}, 1000);
return dfd.promise();
}
function three() {
setTimeout(function () {
console.log('three');
}, 1000);
}
function onTwoError() {
console.log('twoError', arguments);
}
function onOneError() {
console.log('oneError', arguments);
}
one(function () {
two(three)
});
function one(callback) {
console.log('one');
setTimeout(callback, 1000);
}
function two(callback) {
console.log('two');
setTimeout(callback, 1000);
}
function three() {
console.log('three');
}
Как узнать, в каком месте вылезла ошибка?console.error выводит полный стек вызовов со ссылками на конкретные строки конкретных скриптов.
var classes = ['item-id', 'item-title', 'item-price'],
table = document.getElementById('table'),
rows = table.getElementsByTagName('tr'),
rowIndex, cellIndex, cells, currentRow, currentCell, addToCartCell;
// Пропускаем первую строку, потому что в ней находится заголовок таблицы
for (rowIndex = 1; rowIndex < rows.length; rowIndex++) {
currentRow = rows[rowIndex];
cells = currentRow.getElementsByTagName('td');
for (cellIndex = 0; cellIndex < cells.length; cellIndex++) {
currentCell = cells[cellIndex];
currentCell.setAttribute('class', classes[cellIndex]);
};
addToCartCell = document.createElement("td");
addToCartCell.innerHTML = '<a class="add_item">Добавить в корзину</a>';
currentRow.appendChild(addToCartCell);
};
function getTable() {
return document.getElementById('table')
}
function getRows(table) {
var allTableRows = table.getElementsByTagName('tr'),
rows = [],
index;
// Пропускаем первую строку, потому что в ней находится заголовок таблицы
for (index = 1; index < allTableRows.length; index++) {
rows.push(allTableRows[index]);
}
return rows;
}
function appendAddToCartButton(row) {
var cell = document.createElement("td");
cell.innerHTML = '<a class="add_item">Добавить в корзину</a>';
row.appendChild(cell);
}
function setCellsClasses(row) {
var classes = ['item-id', 'item-title', 'item-price'],
cells = row.getElementsByTagName('td'),
index;
// Обратите внимание, что здесь мы итерируем по классам, а не по ячейкам
// В том случае, если в функции prepareTable кто-то по ошибке
// поменяет местами строки добавления классов и кнопки добавления в корзину
// код не сломается
for (index = 0; index < classes.length; index++) {
cells[index].setAttribute('class', classes[index]);
}
}
function prepareTable() {
var table = getTable(),
rows = getRows(table),
rowIndex, currentRow;
for (rowIndex = 0; rowIndex < rows.length; rowIndex++) {
currentRow = rows[rowIndex];
setCellsClasses(currentRow);
appendAddToCartButton(currentRow);
}
}
prepareTable();