Хелпер для Js

Тема в разделе "Базовые решения", создана пользователем Gisma, 26 янв 2008.

Наш партнер Genesis Hackspace
  1. Gisma

    Gisma Гость

    Класс очень старый, но хотелось бы услышать мнение по нему. Задачи класса достаточно широкие: подвешивать проверку данных по сабмиту, подвешивать события (в том числе вызов в контексте нужного объекта), подключение горячих клавиш
    Примеры вызова класса:
    Код (Text):
    На горячие клавиши
    var $objKey = {
    keyCode:115,
    shiftKey:0,
    altKey:0,
    ctrlKey:0
    }
    controller.onKeyPress(document,$objKey,'alert(1);');
    На проверку данных
    Код (Text):
    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` ');
    На подключение событий
    Код (Text):
            controller.applyMethod('buttonid','onclick','alert("submit")');
    controller.applyMethod('formid','onclick',this,'alert("sended")');
    Код класса
    Код (Text):
    /**
    *  -------------------------------------------------------------------------------------------
    *  @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();
     
Загрузка...

Поделиться этой страницей