Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 7
1

Объяснить код табличного процессора на JS

04.06.2015, 08:34. Просмотров 422. Ответов 11
Метки нет (Все метки)

Кто-нибудь,может мне объяснить последовательность операций в js коде.Хочу использовать этот скрипт для написания курсовой,помогите!!!
Вот сам непонятный скрипт http://m.habrahabr.ru/post/202304/
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2015, 08:34
Ответы с готовыми решениями:

В среде табличного процессора MS Excel на основе следующих таблиц создать базу данных(
Дали такую ​​задачу, как сделать толком незнаю, если кто-то поможет буду очень благодарен. Спасибо!

Объяснить код
Здравствуйте, скоро экзамен по компьютерной графике. Учительница сказала что будет задание...

Объяснить код
Пожалуйста, объясните код, а то я ничего не понимаю. Если не трудно, то прям каждую строчку. За...

Объяснить код
Всем добрый день. Есть код public class Dog { String name; public static void...

11
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
04.06.2015, 18:00 2
А почему подобный код должен быть понятным? Он и так гораздо понятнее, чем обычно.
0
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 7
05.06.2015, 09:34  [ТС] 3
Qwertiy, я просто JavaScript не изучал,знаю Паскаль,можете ли вы объяснить пошагово,что выполняется в программе
0
Ренегат
Эксперт HTML/CSS
1731 / 1076 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
06.06.2015, 12:24 4
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
for (var i=0; i<6; i++) {// генератор таблицы, он ищет таблицу и вставляет туда строку, а в строку уже и ячейки
    var row = document.querySelector("table").insertRow(-1);
    for (var j=0; j<6; j++) {
        var letter = String.fromCharCode("A".charCodeAt(0)+j-1);
        row.insertCell(-1).innerHTML = i&&j ? "<input id='"+ letter+i +"'/>" : i||letter;
    }
}
 
var DATA={}// это копия таблицы, только уже скомпилированная
, INPUTS=[].slice.call(document.querySelectorAll("input"));// тут получают nodelist и превращают его в массив, для более удобной обработки
INPUTS.forEach(function(elm) {// соответственно сама обработка таблицы(самое интересное), elem это как раз таки input 
    elm.onfocus = function(e) {// как только elem получает фокус
        e.target.value = localStorage[e.target.id] || "";// мы берём формулу из локального хранилища
    };
    elm.onblur = function(e) {// как только elem теряет фокус
        localStorage[e.target.id] = e.target.value;// мы записываем его формулу в локалное хранилище
        computeAll();// "компилим" таблицу
    };
    var getter = function() {// функ-я преобразования формулы в её вывод
        var value = localStorage[elm.id] || "";// берём формулу из локального франилища
        if (value.charAt(0) == "=") {// если первый знак "=" то преобразовываем формулу
            with (DATA) return eval(value.substring(1));// конструкция with позволяет не использоватя "префикс" тогда формулы были бы такого вида: =DATA.a1+DATA.a4, а eval это фукция исполнения строки, ну типа встроенного компилятора языка js
        } else { return isNaN(parseFloat(value)) ? value : parseFloat(value); } // если не "=" то либо берём значение из ячейки, либо превращаем значение в число
    };
    Object.defineProperty(DATA, elm.id, {get:getter});// запись скомпилиных значений в DATA, =A1+2 -> значение A1 + 2
    Object.defineProperty(DATA, elm.id.toLowerCase(), {get:getter});// тоже самое но только маленькими буквами, =a1 + 2 -> A1 + 2
});
(window.computeAll = function() {// функця компилер, она перерасчитывает всю таблицу учитывая новые значения
    INPUTS.forEach(function(elm) { try { elm.value = DATA[elm.id]; } catch(e) {} });
})();
Добавлено через 1 минуту
только не забудьте поставить копирайт zag2art'a

Добавлено через 1 минуту
Qwertiy, я с вам согласен, это по-моему лучшая программа для того 30 строчного "конкурса"
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
06.06.2015, 23:36 5
Цитата Сообщение от BANO Посмотреть сообщение
} else { return isNaN(parseFloat(value)) ? value : parseFloat(value); } // если не "=" то либо берём значение из ячейки, либо превращаем значение в число
Кстати, в этой строке баг. Если ввести что-то типа 12qqq, то отобразится 12 и только на фокус будет показываться оригинальное значение.

Цитата Сообщение от BANO Посмотреть сообщение
Object.defineProperty(DATA, elm.id, {get:getter});// запись скомпилиных значений в DATA, =A1+2 -> значение A1 + 2
Не совсем. Записывается геттер, и это неспроста. Теперь DATA обладает свойством с именем ячейки, при обращении к которому значение будет пересчитываться. Та штука с with выше будет вызывать именно такие свойства, заставляя пересчитаться и другие ячейки - рекурсия такая.

И ещё две строчки недокомментированные остались. Причём обе с подвохом:

INPUTS.forEach(function(elm) { try { elm.value = DATA[elm.id]; } catch(e) {} });
Вычисляем значение ячейки. catch нужен чтобы игнорировать переполнение стека - это и есть та обработка циклических ссылок, о которой говорится в описании.

})();
Не только присвоили функцию вычисления таблицы, но и вызвали её. Если страница только открыта и накаких изменений ещё внесено не было, то значения всё равно вычислятся сразу.

Цитата Сообщение от BANO Посмотреть сообщение
Qwertiy, я с вам согласен, это по-моему лучшая программа для того 30 строчного "конкурса"
Я не следил за ним. Видел несколько подобных там. Змейка ещё была, помню. А где-то была змейка в один inline-обработчик (причём такой, что его даже в кавычки заключать не пришлось) с единственным канвосом.
0
Ренегат
Эксперт HTML/CSS
1731 / 1076 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
09.06.2015, 16:44 6
Qwertiy, ну в той строке не баг, а просто использование стандартного метода
это понятно что будет только число браться, я тоже учил методы преобразования строк в числа, и не только десятичные

этот мэтод заточен именно под выборку нормальных чисел, то есть предохраняет от таких придурошных написаний, которое вы продемонстрировали

конечно можно изменить эту строку на регулярное выражение, но тогда синтаксис делается менее устойчивым к "случайным" буквам
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
09.06.2015, 17:02 7
Цитата Сообщение от BANO Посмотреть сообщение
ну в той строке не баг, а просто использование стандартного метода
В этом использовании баг и заключается.
Всё что не число должно становиться строкой.

Цитата Сообщение от BANO Посмотреть сообщение
конечно можно изменить эту строку на регулярное выражение
Можно, но зачем? Можно же так:
Javascript
1
+value || value==0 && value.trim().length
0
Ренегат
Эксперт HTML/CSS
1731 / 1076 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
09.06.2015, 17:07 8
Qwertiy, я с вами согласен, просто сначала не понял к чему вы ведёте
а на самом деле и действительно не доработка, жаль меня нету на хабрахабре, но если вы можете пожалуйста киньте этот код в комментарии к статье про этот 30 строчный exel
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
09.06.2015, 18:45 9
Цитата Сообщение от BANO Посмотреть сообщение
жаль меня нету на хабрахабре
Меня тоже...
0
BANO
09.06.2015, 22:28
  #10

Не по теме:

Qwertiy, как я понял туда только по пригласительным

0
657 / 629 / 333
Регистрация: 26.04.2014
Сообщений: 2,102
09.06.2015, 23:27 11
Цитата Сообщение от Qwertiy Посмотреть сообщение
Меня тоже...
А я есть.
0
Qwertiy
09.06.2015, 23:35     Объяснить код табличного процессора на JS
  #12

Не по теме:

Цитата Сообщение от BANO Посмотреть сообщение
как я понял туда только по пригласительным
Ну типа того. Надо чтобы кому-то понравилась твоя статья. Но я даже не пробовал.

0
09.06.2015, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2015, 23:35
Привет! Вот еще темы с ответами:

Объяснить код
Написать программу, которая вычисляет частичную сумму ряда \sum_{k=1}^{\infty}ln(1+\frac{1}{k})...

Объяснить код
Всем привет, может кто ни будь разъяснить мне этот код пожалуйста. А то я либо спёкся уже, или...

Объяснить код
Здравствуйте. Помогите пожалуйста прописать, что происходит в данном коде по строкам #include...

Объяснить код
Здравствуйте, может у кого есть справочник или хоть что то объясняющее на понятном языке как в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.