Хелпер для Js

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

  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();
     
Загрузка...

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