Ajout exercices supplémentaires formation JS
This commit is contained in:
BIN
javascript/base/exercices/vanilla-todos/img/vanilla.png
Normal file
BIN
javascript/base/exercices/vanilla-todos/img/vanilla.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
@ -5,7 +5,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1><img class="logo" src="../../img/vanilla.png" /> Vanilla Todos</h1>
|
||||
<h1><img class="logo" src="img/vanilla.png" /> Vanilla Todos</h1>
|
||||
<div id="vanilla-todos">
|
||||
<table>
|
||||
<thead>
|
||||
@ -34,7 +34,7 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script src="vanilla-todos.js"></script>
|
||||
<script src="vanilla-todos-obfuscated.js"></script>
|
||||
<script>
|
||||
(function() {
|
||||
VanillaTodos.mount('#vanilla-todos');
|
||||
|
@ -0,0 +1 @@
|
||||
var _0x711e=["\x56\x61\x6E\x69\x6C\x6C\x61\x54\x6F\x64\x6F\x73","\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74","\x6D\x6F\x75\x6E\x74","\x71\x75\x65\x72\x79\x53\x65\x6C\x65\x63\x74\x6F\x72","\x49\x6E\x76\x61\x6C\x69\x64\x20\x73\x65\x6C\x65\x63\x74\x6F\x72\x20\x22","\x22\x20\x21","\x6C\x65\x6E\x67\x74\x68","\x2E\x6E\x65\x77\x2D\x74\x6F\x64\x6F","\x6B\x65\x79\x64\x6F\x77\x6E","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x2E\x73\x65\x61\x72\x63\x68\x2D\x74\x6F\x64\x6F\x73","\x6B\x65\x79\x75\x70","\x63\x6C\x69\x63\x6B","\x61\x2E\x72\x65\x6D\x6F\x76\x65\x2D\x74\x6F\x64\x6F","\x6D\x61\x74\x63\x68\x65\x73","\x74\x61\x72\x67\x65\x74","\x74\x6F\x64\x6F\x49\x64","\x64\x61\x74\x61\x73\x65\x74","\x69\x64","\x73\x70\x6C\x69\x63\x65","\x63\x75\x72\x72\x65\x6E\x74\x54\x61\x72\x67\x65\x74","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x76\x61\x6C\x75\x65","\x69\x6E\x64\x65\x78\x4F\x66","\x74\x65\x78\x74","\x66\x69\x6C\x74\x65\x72","\x6B\x65\x79\x43\x6F\x64\x65","\x6E\x6F\x77","","\x70\x75\x73\x68","\x2E\x74\x6F\x64\x6F\x73\x2D\x6C\x69\x73\x74","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x66\x6F\x72\x45\x61\x63\x68","\x74\x72","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x64","\x61","\x68\x72\x65\x66","\x23","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x72\x65\x6D\x6F\x76\x65\x2D\x74\x6F\x64\x6F","\x53\x75\x70\x70\x72\x69\x6D\x65\x72","\x76\x61\x6E\x69\x6C\x6C\x61\x54\x6F\x64\x6F\x73\x2E\x74\x6F\x64\x6F\x73","\x67\x65\x74\x49\x74\x65\x6D","\x6C\x6F\x63\x61\x6C\x53\x74\x6F\x72\x61\x67\x65","\x5B\x5D","\x70\x61\x72\x73\x65","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x73\x65\x74\x49\x74\x65\x6D"];(function(_0xaf1ax1,_0xaf1ax2){_0x711e[1];var _0xaf1ax3;var _0xaf1ax4=[];var _0xaf1ax5=_0xaf1ax2[_0x711e[2]];_0xaf1ax1[_0x711e[3]]=function(_0xaf1ax6){_0xaf1ax3=_0xaf1ax5[_0x711e[4]](_0xaf1ax6);if(!_0xaf1ax3){throw new Error(_0x711e[5]+_0xaf1ax6+_0x711e[6])};_0xaf1ax7();_0xaf1ax4=_0xaf1ax1c();if(_0xaf1ax4[_0x711e[7]]>0){_0xaf1ax14()};};function _0xaf1ax7(){var _0xaf1ax8=_0xaf1ax3[_0x711e[4]](_0x711e[8]);_0xaf1ax8[_0x711e[10]](_0x711e[9],_0xaf1ax12);var _0xaf1ax9=_0xaf1ax3[_0x711e[4]](_0x711e[11]);_0xaf1ax9[_0x711e[10]](_0x711e[12],_0xaf1axf);_0xaf1ax3[_0x711e[10]](_0x711e[13],_0xaf1axa);}function _0xaf1axa(_0xaf1axb){if(_0xaf1axb[_0x711e[16]][_0x711e[15]](_0x711e[14])){var _0xaf1axc=_0xaf1axb[_0x711e[16]][_0x711e[18]][_0x711e[17]];var _0xaf1axd;for(var _0xaf1axe=0;_0xaf1axe<_0xaf1ax4[_0x711e[7]];++_0xaf1axe){_0xaf1axd=_0xaf1ax4[_0xaf1axe];if(_0xaf1axd[_0x711e[19]]==_0xaf1axc){_0xaf1ax4[_0x711e[20]](_0xaf1axe,1);_0xaf1ax14(_0xaf1ax4);_0xaf1ax1e(_0xaf1ax4);};};}}function _0xaf1axf(_0xaf1axb){var _0xaf1ax9=_0xaf1axb[_0x711e[21]];var _0xaf1ax10=_0xaf1ax9[_0x711e[23]][_0x711e[22]]();var _0xaf1ax11;if(_0xaf1ax10){_0xaf1ax11=_0xaf1ax4[_0x711e[26]](function(_0xaf1axd){if(_0xaf1axd[_0x711e[25]][_0x711e[22]]()[_0x711e[24]](_0xaf1ax10)!== -1){return true}})};_0xaf1ax14(_0xaf1ax11);}function _0xaf1ax12(_0xaf1axb){if(_0xaf1axb[_0x711e[27]]!==13){return };var _0xaf1ax13=_0xaf1axb[_0x711e[21]];var _0xaf1axd={id:Date[_0x711e[28]](),text:_0xaf1ax13[_0x711e[23]]};_0xaf1ax13[_0x711e[23]]=_0x711e[29];_0xaf1ax4[_0x711e[30]](_0xaf1axd);_0xaf1ax14(_0xaf1ax4);_0xaf1ax1e(_0xaf1ax4);}function _0xaf1ax14(_0xaf1ax11){_0xaf1ax11=_0xaf1ax11||_0xaf1ax4;var _0xaf1ax15=_0xaf1ax3[_0x711e[4]](_0x711e[31]);_0xaf1ax15[_0x711e[32]]=_0x711e[29];_0xaf1ax11[_0x711e[34]](function(_0xaf1axd,_0xaf1axe){var _0xaf1ax16=_0xaf1ax17(_0xaf1axd);_0xaf1ax15[_0x711e[33]](_0xaf1ax16);});}function _0xaf1ax17(_0xaf1axd){var _0xaf1ax16=_0xaf1ax5[_0x711e[36]](_0x711e[35]);_0xaf1ax16[_0x711e[33]](_0xaf1ax18(_0xaf1axd));_0xaf1ax16[_0x711e[33]](_0xaf1ax1a(_0xaf1axd));return _0xaf1ax16;}function _0xaf1ax18(_0xaf1axd){var _0xaf1ax19=_0xaf1ax5[_0x711e[36]](_0x711e[37]);_0xaf1ax19[_0x711e[32]]=_0xaf1axd[_0x711e[25]];return _0xaf1ax19;}function _0xaf1ax1a(_0xaf1axd){var _0xaf1ax19=_0xaf1ax5[_0x711e[36]](_0x711e[37]);var _0xaf1ax1b=_0xaf1ax5[_0x711e[36]](_0x711e[38]);_0xaf1ax1b[_0x711e[39]]=_0x711e[40];_0xaf1ax1b[_0x711e[41]]=_0x711e[42];_0xaf1ax1b[_0x711e[18]][_0x711e[17]]=_0xaf1axd[_0x711e[19]];_0xaf1ax1b[_0x711e[32]]=_0x711e[43];_0xaf1ax19[_0x711e[33]](_0xaf1ax1b);return _0xaf1ax19;}function _0xaf1ax1c(){var _0xaf1ax1d=_0xaf1ax2[_0x711e[46]][_0x711e[45]](_0x711e[44]);return JSON[_0x711e[48]](_0xaf1ax1d||_0x711e[47]);}function _0xaf1ax1e(_0xaf1ax11){var _0xaf1ax1d=JSON[_0x711e[49]](_0xaf1ax11);_0xaf1ax2[_0x711e[46]][_0x711e[50]](_0x711e[44],_0xaf1ax1d);}}(this[_0x711e[0]]=this[_0x711e[0]]||{},window));
|
166
javascript/base/exercices/vanilla-todos/vanilla-todos-src.js
Normal file
166
javascript/base/exercices/vanilla-todos/vanilla-todos-src.js
Normal file
@ -0,0 +1,166 @@
|
||||
(function(VT, window) {
|
||||
|
||||
"use strict";
|
||||
|
||||
// Déclaration des variables
|
||||
var _rootEl; // Élement racine de notre application
|
||||
var _todos = []; // Notre liste de todos
|
||||
var document = window.document; // Alias
|
||||
|
||||
/*
|
||||
* API publique
|
||||
*/
|
||||
|
||||
/*
|
||||
* "Monte" l'application VanillaTodo sur l'élément du DOM
|
||||
* correspondant au sélecteur CSS donné
|
||||
*/
|
||||
VT.mount = function(selector) {
|
||||
|
||||
_rootEl = document.querySelector(selector);
|
||||
|
||||
if(!_rootEl) {
|
||||
throw new Error('Invalid selector "'+selector+'" !');
|
||||
}
|
||||
|
||||
_initHandlers();
|
||||
_todos = _loadTodos();
|
||||
if(_todos.length > 0) {
|
||||
_renderTodos();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* API privée
|
||||
*/
|
||||
|
||||
function _initHandlers() {
|
||||
|
||||
var saveButton = _rootEl.querySelector('.new-todo');
|
||||
saveButton.addEventListener('keydown', _saveNewTodoHandler);
|
||||
|
||||
var searchInput = _rootEl.querySelector('.search-todos');
|
||||
searchInput.addEventListener('keyup', _searchInputChangeHandler);
|
||||
|
||||
// Délégation d'évènement, voir _removeTodoClickHandler
|
||||
_rootEl.addEventListener('click', _removeTodoClickHandler);
|
||||
|
||||
}
|
||||
|
||||
function _removeTodoClickHandler(evt){
|
||||
if(evt.target.matches('a.remove-todo')) {
|
||||
var todoId = evt.target.dataset.todoId;
|
||||
var todo;
|
||||
for(var i = 0; i < _todos.length; ++i) {
|
||||
todo = _todos[i];
|
||||
if(todo.id == todoId) {
|
||||
_todos.splice(i, 1);
|
||||
_renderTodos(_todos);
|
||||
_saveTodos(_todos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _searchInputChangeHandler(evt) {
|
||||
|
||||
var searchInput = evt.currentTarget;
|
||||
var searchText = searchInput.value.toLowerCase();
|
||||
|
||||
var todos;
|
||||
|
||||
if(searchText) {
|
||||
todos = _todos.filter(function(todo) {
|
||||
if(todo.text.toLowerCase().indexOf(searchText) !== -1) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_renderTodos(todos);
|
||||
|
||||
}
|
||||
|
||||
function _saveNewTodoHandler(evt) {
|
||||
|
||||
if(evt.keyCode !== 13) return; // Enter
|
||||
|
||||
var newTodoInput = evt.currentTarget;
|
||||
|
||||
var todo = {
|
||||
id: Date.now(),
|
||||
text: newTodoInput.value
|
||||
};
|
||||
|
||||
newTodoInput.value = '';
|
||||
|
||||
_todos.push(todo);
|
||||
|
||||
_renderTodos(_todos);
|
||||
|
||||
_saveTodos(_todos);
|
||||
|
||||
}
|
||||
|
||||
function _renderTodos(todos) {
|
||||
|
||||
todos = todos || _todos;
|
||||
|
||||
var todosList = _rootEl.querySelector('.todos-list');
|
||||
|
||||
todosList.innerHTML = '';
|
||||
|
||||
todos.forEach(function(todo, i) {
|
||||
var row = _createTodoRow(todo);
|
||||
todosList.appendChild(row);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function _createTodoRow(todo) {
|
||||
var row = document.createElement('tr');
|
||||
row.appendChild( _createTodoCell(todo) );
|
||||
row.appendChild( _createActionsCell(todo) );
|
||||
return row;
|
||||
}
|
||||
|
||||
function _createTodoCell(todo) {
|
||||
var cell = document.createElement('td');
|
||||
cell.innerHTML = todo.text;
|
||||
return cell;
|
||||
}
|
||||
|
||||
function _createActionsCell(todo) {
|
||||
var cell = document.createElement('td');
|
||||
var removeLink = document.createElement('a');
|
||||
removeLink.href = '#';
|
||||
removeLink.className = "remove-todo";
|
||||
removeLink.dataset.todoId = todo.id;
|
||||
removeLink.innerHTML = 'Supprimer';
|
||||
cell.appendChild(removeLink);
|
||||
return cell;
|
||||
}
|
||||
|
||||
/*
|
||||
* Charge les tâches depuis le localStorage
|
||||
*
|
||||
* Retourne les tâches sous la forme d'un tableau d'objets
|
||||
*/
|
||||
function _loadTodos() {
|
||||
var todosStr = window.localStorage.getItem('vanillaTodos.todos');
|
||||
return JSON.parse(todosStr || '[]');
|
||||
}
|
||||
|
||||
/*
|
||||
* Sauvegarde le tableau de tâches donné dans le localStorage
|
||||
*
|
||||
* Ne retourne rien
|
||||
*/
|
||||
function _saveTodos(todos) {
|
||||
var todosStr = JSON.stringify(todos);
|
||||
window.localStorage.setItem('vanillaTodos.todos', todosStr);
|
||||
}
|
||||
|
||||
|
||||
}(this.VanillaTodos = this.VanillaTodos || {}, window));
|
@ -7,9 +7,9 @@
|
||||
var _todos = []; // Notre liste de todos
|
||||
var document = window.document; // Alias
|
||||
|
||||
/*
|
||||
/***************
|
||||
* API publique
|
||||
*/
|
||||
***************/
|
||||
|
||||
/*
|
||||
* "Monte" l'application VanillaTodo sur l'élément du DOM
|
||||
@ -23,130 +23,31 @@
|
||||
throw new Error('Invalid selector "'+selector+'" !');
|
||||
}
|
||||
|
||||
_initHandlers();
|
||||
_todos = _loadTodos();
|
||||
if(_todos.length > 0) {
|
||||
_renderTodos();
|
||||
}
|
||||
|
||||
// A vous de compléter !
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
/**************
|
||||
* API privée
|
||||
**************/
|
||||
|
||||
/*
|
||||
* Charge les tâches depuis le localStorage
|
||||
*
|
||||
* Retourne les tâches sous la forme d'un tableau d'objets
|
||||
*/
|
||||
|
||||
function _initHandlers() {
|
||||
|
||||
var saveButton = _rootEl.querySelector('.new-todo');
|
||||
saveButton.addEventListener('keydown', _saveNewTodoHandler);
|
||||
|
||||
var searchInput = _rootEl.querySelector('.search-todos');
|
||||
searchInput.addEventListener('keyup', _searchInputChangeHandler);
|
||||
|
||||
// Délégation d'évènement, voir _removeTodoClickHandler
|
||||
_rootEl.addEventListener('click', _removeTodoClickHandler);
|
||||
|
||||
}
|
||||
|
||||
function _removeTodoClickHandler(evt){
|
||||
if(evt.target.matches('a.remove-todo')) {
|
||||
var todoId = evt.target.dataset.todoId;
|
||||
var todo;
|
||||
for(var i = 0; i < _todos.length; ++i) {
|
||||
todo = _todos[i];
|
||||
if(todo.id == todoId) {
|
||||
_todos.splice(i, 1);
|
||||
_renderTodos(_todos);
|
||||
_saveTodos(_todos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _searchInputChangeHandler(evt) {
|
||||
|
||||
var searchInput = evt.currentTarget;
|
||||
var searchText = searchInput.value.toLowerCase();
|
||||
|
||||
var todos;
|
||||
|
||||
if(searchText) {
|
||||
todos = _todos.filter(function(todo) {
|
||||
if(todo.text.toLowerCase().indexOf(searchText) !== -1) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_renderTodos(todos);
|
||||
|
||||
}
|
||||
|
||||
function _saveNewTodoHandler(evt) {
|
||||
|
||||
if(evt.keyCode !== 13) return; // Enter
|
||||
|
||||
var newTodoInput = evt.currentTarget;
|
||||
|
||||
var todo = {
|
||||
id: Date.now(),
|
||||
text: newTodoInput.value
|
||||
};
|
||||
|
||||
newTodoInput.value = '';
|
||||
|
||||
_todos.push(todo);
|
||||
|
||||
_renderTodos(_todos);
|
||||
|
||||
_saveTodos(_todos);
|
||||
|
||||
}
|
||||
|
||||
function _renderTodos(todos) {
|
||||
|
||||
todos = todos || _todos;
|
||||
|
||||
var todosList = _rootEl.querySelector('.todos-list');
|
||||
|
||||
todosList.innerHTML = '';
|
||||
|
||||
todos.forEach(function(todo, i) {
|
||||
var row = _createTodoRow(todo);
|
||||
todosList.appendChild(row);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function _createTodoRow(todo) {
|
||||
var row = document.createElement('tr');
|
||||
row.appendChild( _createTodoCell(todo) );
|
||||
row.appendChild( _createActionsCell(todo) );
|
||||
return row;
|
||||
}
|
||||
|
||||
function _createTodoCell(todo) {
|
||||
var cell = document.createElement('td');
|
||||
cell.innerHTML = todo.text;
|
||||
return cell;
|
||||
}
|
||||
|
||||
function _createActionsCell(todo) {
|
||||
var cell = document.createElement('td');
|
||||
var removeLink = document.createElement('a');
|
||||
removeLink.href = '#';
|
||||
removeLink.className = "remove-todo";
|
||||
removeLink.dataset.todoId = todo.id;
|
||||
removeLink.innerHTML = 'Supprimer';
|
||||
cell.appendChild(removeLink);
|
||||
return cell;
|
||||
}
|
||||
|
||||
function _loadTodos() {
|
||||
var todosStr = window.localStorage.getItem('vanillaTodos.todos');
|
||||
return JSON.parse(todosStr || '[]');
|
||||
}
|
||||
|
||||
/*
|
||||
* Sauvegarde le tableau de tâches donné dans le localStorage
|
||||
*
|
||||
* Ne retourne rien
|
||||
*/
|
||||
function _saveTodos(todos) {
|
||||
var todosStr = JSON.stringify(todos);
|
||||
window.localStorage.setItem('vanillaTodos.todos', todosStr);
|
||||
|
BIN
javascript/base/exercices/vanilla-todos/vanilla-todos.tar.gz
Normal file
BIN
javascript/base/exercices/vanilla-todos/vanilla-todos.tar.gz
Normal file
Binary file not shown.
Reference in New Issue
Block a user