Как использовать JavaScript-расширения
Обратите внимание
Документация на русском языке может быть устаревшей. Самые последние изменения доступны в документации на английском языке.
Примечание
Справочник по настройке интерфейса описывает работу редактора HTML/JS/CSS. Вы также можете попробовать создать интерфейс задания в Конструкторе шаблонов.
Все аспекты жизненного цикла заданий контролируются тремя JavaScript-классами:
-
Assignment управляет ходом выполнения задания, обрабатывает команды страницы заданий на отправку ответов, пропуск, приостановку задания и т. п. Также он создает экземпляр класса TaskSuite.
-
TaskSuite — «класс-обертка» для интерфейса страницы заданий. Вы можете переопределить этот класс, чтобы, например, отобразить общий элемент на этой странице.
-
Task отвечает за отрисовку и валидацию отдельного задания. Если от задания требуется нестандартное поведение, как правило, следует расширять именно его.
Для решения специфических задач, таких как подписка на нажатие клавиш или получение GPS-координат исполнителя, можно использовать сервисы.
Жизненный цикл задания
Когда исполнитель приступает к выполнению заданий, во встроенном фрейме инициализируется его рабочее пространство. Между головной страницей Толоки и фреймом устанавливается канал для обмена сообщениями. Сначала запрашивается список заданий и создается экземпляр класса Assignment
. Далее полученный список передается классу TaskSuite
. Он создает экземпляр класса Task
для каждого задания.
Отрисовка
Для отрисовки страницы заданий вызывается метод render()
класса TaskSuite
. Этот метод вызывает метод render()
класса Task
для каждого из заданий и собирает созданные компоненты DOM-дерева в единый список.
Здесь вы можете изменять отрисовку задания и страницы заданий.
Валидация ответов
Когда исполнитель нажимает на кнопку Отправить, вызывается метод TaskSuite.validate(solutions)
для валидации ответов исполнителя. Он вызывает метод Task.validate(solutions)
для каждого задания и возвращает ошибки.
Здесь вы можете проводить дополнительную проверку ответов исполнителя.
Удаление
Когда исполнитель закончил все задания на странице или пропустил ее, вызывается метод destroy()
класса TaskSuite
. Он вызывает метод destroy()
класса Task
для каждого задания. Эти методы освобождают ресурсы и удаляют сервисы и обработчики событий, связанные с заданиями.
Наследование классов
Чтобы код не выглядел громоздким, для наследования и переопределения классов используйте функцию:
function extend(ParentClass, constructorFunction, prototypeHash) {
constructorFunction = constructorFunction || function() {};
prototypeHash = prototypeHash || {};
if (ParentClass) {
constructorFunction.prototype = Object.create(ParentClass.prototype);
}
for (var i in prototypeHash) {
constructorFunction.prototype[i] = prototypeHash[i];
}
return constructorFunction;
}
Вызов функции:
var ChildClass = extend(ParentClass, function() {
ParentClass.call(this);
}, {
method: function() {}
})
Типы данных
Объект Task
— задание.
{
"id": <строка>,
"input_values": {
"<id поля с входными данными>": <значение>,
…
}
}
Ключ |
Значение |
|
Идентификатор задания. |
|
Входные данные задания в формате Пример:
|
Объект Solution
— ответ исполнителя на задание.
{
"task_id": <строка>,
"output_values": {
"<id поля ввода>": <значение>,
…
}
}
Ключ |
Значение |
|
Идентификатор задания. |
|
Ответы в формате Пример:
|
Объект SolutionValidationError
— ошибка валидации ответа исполнителя.
{
"task_id": string,
"errors": {
"<id поля ввода>": {
"code": "<код ошибки>",
"message": "<строка>"
},
…
}
}
Ключ |
Значение |
|
Идентификатор задания. |
|
Ошибки в формате: Пример:
|