• Codeby web-security - Курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...

  • Мобильный клиент нашего форума для Android гаджетов доступен в Google Play Market по этой ссылке. Клиент можно скачать с нашего форума по этой ссылке. Последняя версия МК в нашем телеграм канале вот здесь. Мобильный клиент для IOS находится в itunes по этой ссылке

Хелпер для Js

  • Автор темы Gisma
  • Дата начала
G

Gisma

#1
Класс очень старый, но хотелось бы услышать мнение по нему. Задачи класса достаточно широкие: подвешивать проверку данных по сабмиту, подвешивать события (в том числе вызов в контексте нужного объекта), подключение горячих клавиш
Примеры вызова класса:
Код:
На горячие клавиши
var $objKey = {
keyCode:115,
shiftKey:0,
altKey:0,
ctrlKey:0
}
controller.onKeyPress(document,$objKey,'alert(1);');
На проверку данных
Код:
controller.onSubmitMatch('national_account_number',/.+/,'Please fill field `Base national Currency account number` ');
controller.onSubmitEval('bank_account_type','document.getElementById("bank_account_type").value != 0','Please fill field `Bank Account type` ');
На подключение событий
Код:
		controller.applyMethod('buttonid','onclick','alert("submit")');
controller.applyMethod('formid','onclick',this,'alert("sended")');
Код класса
Код:
/**
*  -------------------------------------------------------------------------------------------
*  @desc Описание objKey
*  @return 
*  -------------------------------------------------------------------------------------------

$objKey = {
keyCode:0,
shiftKey:0,
altKey:0,
ctrlKey:0
}
*/

/**
*  @desc Редакти
*/
function onController() {
this.bCode = '';
this.$aMethodQuery = new Array();
}
/**
*  @desc Принимает HTML и целевую функцию
function addCodeToEvent() 
*/
onController.prototype.addCodeToEvent = function (target_Obj,event,code) {
if (target_Obj[event])
{
var szFunction = target_Obj[event].toString();
szFunction = szFunction.replace(RegExp("^[\s\n]*function[^{]*\\{",'gi'),'');
szFunction = szFunction.replace(RegExp("\\}[\s\n]*$",'gi'), "");
} else {
szFunction = '';
}

szFunction = code + szFunction;

target_Obj[event] = new Function('event1',szFunction);
}
/**
*  @desc Добавляет новый обработчик горячей клавиши к указанному id 
function addToId() {
*/
onController.prototype.addToId = function (target,event,code) {
this.addCodeToEvent (document.getElementById(target),event,code)

}
/**
*  @desc
function onKey() {
*/
onController.prototype.onKey = function (target,method,objKey,code)
{
szCode = '';
szCode += ''
szCode += 'if (event1 != null) event = event1;' + "\r\n";
//	szCode += 'var_dump(event,1);'
//	szCode += 'return 1;';
szCode += 'var $keyCode = event.keyCode == 0?event.charCode:event.keyCode;' + "\r\n";
//	szCode += 'alert($keyCode);alert(event.shiftKey);alert(event.altKey);alert(event.ctrlKey);';
szCode += "bResult = ($keyCode == " + objKey.keyCode + ");\r\n"
szCode += "bResult = (bResult && (event.shiftKey == " + objKey.shiftKey + "));\r\n"
szCode += "bResult = (bResult && (event.altKey == " + objKey.altKey + "));\r\n"
szCode += "bResult = (bResult && (event.ctrlKey == " + objKey.ctrlKey + "));\r\n"
szCode += "if (bResult) { \r\n" + code + "\r\n}"
if (typeof(target) == 'string') {
this.addCodeToEvent (document.getElementById(target),method,szCode);
} else {
this.addCodeToEvent (target,method,szCode);
}


}/**
*  @desc Подвешивает на onKeyDown реакцию на указанный id=target
function onKeyDown() {
*/
onController.prototype.onKeyDown = function (target,objKey,code) {
this.onKey(target,'onkeydown',objKey,code)
}
/**
*  @desc Подвешивает на onKeyUp реакцию на указанный id=target
function onKeyUp() {
*/
onController.prototype.onKeyUp = function (target,objKey,code) {
this.onKey(target,'onkeyup',objKey,code);
}
/**
*  @desc Подвешивает на onKeyPress реакцию на указанный id=target
function onKeyPress() {
*/
onController.prototype.onKeyPress = function (target,objKey,code) {
this.onKey(target,'onkeypress',objKey,code);
}
/**
*  @desc Подвешивает проверку контрола на onSubmit
function onSubmitMatch()
*/
onController.prototype.onSubmitMatch = function (target,regexp,message) 
{

// получаем форму
var $obj;
$obj = document.getElementById(target);
var $form;
if (!$obj) {
alert('Error onSubmitCompare . Control-"'+ target +'" not found');
return;
}
if ($obj.form == null)
{
// если формы нет, то выход с объевлением об ошибке 
alert('Error onSubmitMatch. Control-"'+ target +'" form not found');
return;
}
// формируем код
var code = '';
code += 'if (!document.getElementById("'+ target + '").value.match('+ regexp.toString() + ')) {' + "\r\n";

code += "\talert(\""+ message + "\");\r\n"
code += "\t" + 'document.getElementById("'+ target + '").focus()' + "\r\n";
code += "\t" + 'return false;' + "\r\n";
code += '}' + "\r\n";
this.addCodeToEvent($obj.form,'onsubmit',code);
//	alert($obj.form.onsubmit);
}
/**
*  @desc Подвешивает проверку Eval на работу 
function onSubmitMatch()
*/
onController.prototype.onSubmitEval = function (target,eval,message) 
{

// получаем форму
var $obj;
$obj = document.getElementById(target);
var $form;
if (!$obj) {
alert('Error onSubmitEval . Control-"'+ target +'" not found');
return;
}
if ($obj.form == null)
{
// если формы нет, то выход с объевлением об ошибке 
alert('Error onSubmitEval. Control-"'+ target +'" form not found');
return;
}
// формируем код
var code = '';
code += 'var $bResult = 0;' + "\r\n";
code += '$bResult = (' + eval +'?1:0);' + "\r\n";
code += 'if (!$bResult) {' + "\r\n";
code += "\talert(\""+ message + "\");\r\n"
code += "\t" + 'document.getElementById("'+ target + '").focus()' + "\r\n";
code += "\t" + 'return false;' + "\r\n";
code += '}' + "\r\n";

this.addCodeToEvent($obj.form,'onsubmit',code);
}
/**
*  @desc Подвешивает проверку контрола на onSubmit
function onSubmitCompare() {
*/
onController.prototype.onSubmitCompare = function (target,target_confirm,message) 
{

// получаем форму
var $obj = document.getElementById(target);
var $form;
if (!$obj) {
alert('Error onSubmitCompare . Control-"'+ target +'" not found');
return;
}
if ($obj.form == null)
{
// если формы нет, то выход с объевлением об ошибке 
alert('Error onSubmitCompare . Control-"'+ target +'" form not found');
return;
}
// формируем код
var code = '';
code = 'if ((document.getElementById("'+ target + '").value.length == 0) || (document.getElementById("'+ target + '").value != document.getElementById("'+ target_confirm + '").value)) {' + "\r\n";
code += "\talert(\""+ message + "\");\r\n"
code += "\t" + 'document.getElementById("'+ target + '").focus()' + "\r\n";
code += "\t" + 'return false;' + "\r\n";
code += '}' + "\r\n";

this.addCodeToEvent($obj.form,'onsubmit',code);
}
/**
*  -------------------------------------------------------------------------------------------
*  @desc Метод подключает реакцию контрола на событие, при этом вызывая метод определенного 
*  объекта. 
*  ВАЖНО!
*  Обычно вызов функци-реакции на событие происходит в контексте вызываюшего контрола 
*  (input, div и т.д.), поэтому если подключать к реакции метод принадлежащий объекту, то 
*  контекст объяекта заменялся (терялся ) контекстом HTML-объекта. Метод решает указанную 
*  проблему
*  @algorithm Метод создает внутреннюю очередь внутри объекта controller, в нее добавляет и 
*  метод и объект. В функцию-реакцию записывает вызов соответствующего метода у очереди
*  @return 
*  -------------------------------------------------------------------------------------------
*/
onController.prototype.applyMethod = function($idTarget,$szEvent,$oObject,$fncMethod,$aAddParams) {
var $obj;
var $szCode = '';
var $aNewElement = new Array();

$obj = document.getElementById($idTarget);
if (!$obj)
{
// если формы нет, то выход с объевлением об ошибке 
alert('Error applyMethod. Control-"'+ $idTarget +'" not found');
return;
}

// подключение к указанному контрола вызова метода у контрола
$aNewElement['object'] = $oObject;
$aNewElement['method'] = $fncMethod;
if ($aAddParams) {
$aNewElement['params'] = $aAddParams;
} else {
$aNewElement['params'] = {};
}

this.$aMethodQuery.push($aNewElement);

// формируем код

$szCode = 'controller.execQueryMethod(' + (this.$aMethodQuery.length - 1) +',this);';

// подключение кода
this.addToId($idTarget,$szEvent,$szCode);
}

/**
*  -------------------------------------------------------------------------------------------
*  @desc Вызывает определенный ($nMethodId) метод в очереди контроллера
*  @param $nMethodId Индекс метода в очереди методов
*  @param $oObject объект в контексте которого вызвано событие
*  @return 
*  -------------------------------------------------------------------------------------------
*/
onController.prototype.execQueryMethod = function($nMethodId,$oObject) {
if (this.$aMethodQuery[$nMethodId]) {
if (this.$aMethodQuery[$nMethodId]['object'] != null) 
this.$aMethodQuery[$nMethodId]['method'].call(
this.$aMethodQuery[$nMethodId]['object'],
$oObject,
this.$aMethodQuery[$nMethodId]['params']);
} else {
alert('Method not found');
}
}
var controller = new onController();
 
Вверх Снизу