Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   ATS - движок для сайта на javascript =) (https://forum.antichat.xyz/showthread.php?t=73521)

Дикс 12.06.2008 14:09

ATS - движок для сайта на javascript =)
 
писал из спортивного интереса, но очень хочу найти и исправить все косяки, чтобы можно было использовать, поэтому выкладываю чтобы потестили.

онлайн-версия здесь: http://litprom.890m.com/ast/

сорцы здесь: http://up.giga.su/738058803/ (6.35 кб)

Назначение:
создание в максимально сжатые сроки статичного сайта с удобной поддержкой и расширением.
Альтернатива серверным модульным движкам, SSI, dreamweaver templates.

Суть проекта:
На страницу цепляется основной скрипт.
Появляется возможность создавать простые ссылки, которые заполняют контент страницы содержимым файлов, лежащих на сервере в текстовом формате.

Дикс 12.06.2008 15:26

я вот че думаю - можно сделать кэширование текстов - сохраняя их в переменные, а затем проверяя их наличие.
как вы считаете - стоит?

DIAgen 12.06.2008 15:32

Цитата:

Сообщение от Дикс
я вот че думаю - можно сделать кэширование текстов - сохраняя их в переменные, а затем проверяя их наличие.
как вы считаете - стоит?

Попробуй это использовать
http://forum.antichat.ru/thread72316.html

astrologer 12.06.2008 20:05

  1. В функции «ajax» логика получения экземпляра XMLHttpRequest воспроизводится каждый раз.
  2. В переменной contentDiv можно сохранить готовую ссылку на объект ( который <div id="corpse" /> ) вместо строки "corpse".
  3. Имеет смысл навешивать обработчики событий в js коде, а не в html.
  4. Чтобы свести к минимуму вероятность перезаписи переменных, можно создать объект, например, «AST» и хранить их там:
    Код:

    var AST =
    {
      folder: 'pages/',
      ext: 'txt',
      load: function(){ /* код */ }
    };

  5. corpse
Цитата:

Сообщение от Дикс
я вот че думаю - можно сделать кэширование текстов - сохраняя их в переменные, а затем проверяя их наличие.
как вы считаете - стоит?

По-моему, нет.

Дикс 12.06.2008 21:22

1, 2 - сделал

Цитата:

3. Имеет смысл навешивать обработчики событий в js коде, а не в html.
не совсем понял.
если у меня будет меню из одних спанов, без онклика и вызова функции,
как я тогда укажу - какой пункт меню, какую страницу открывает?

4 - буду учиться работать с массивами и тоже реализую

5 - ясно. может попробую вот эти способы:
http://forum.antichat.ru/thread72316.html

а ты можешь привести доводы, почему кешировать не стоит?

ПС я знаю что corpse - 'труп'.
это мой маленький кулинарный изыск :)

astrologer 12.06.2008 23:09

Цитата:

а ты можешь привести доводы, почему кешировать не стоит?
Потому, что браузер кэширует страницы самостоятельно, в том числе те, которые получены "Ajax'ом". Воспроизводить эту логику на JS - задача нетривиальная, если подойти к задаче серьёзно.

lazy-реализация первого пункта. Несколько объёмно:
Код:

function XHR()
{
  var ms =
  [
    'Microsoft.XMLHTTP',
    'MSXML2.XMLHTTP',
    'MSXML2.XMLHTTP.3.0',
    'MSXML2.XMLHTTP.4.0',
    'MSXML2.XMLHTTP.5.0'
  ], i = ms.length, nop = function(){};
 
  if(window.XMLHttpRequest)
  {
    return (XHR = function()
    {
      return new XMLHttpRequest();
    })();
  }
  else if(window.ActiveXObject)
  {
    while(i--)
    {
      try
      {
        return (XHR = function()
        {
          return new ActiveXObject(ms[i]);
        })();
      } catch(e) {}
    }
  }
 
  return (XHR = function(){
    return {
      open: nop,
      send: function()
      {
        this.onreadystatechange();
      },
      readyState: 4,
      onreadystatechange: nop,
      responseText: 'XMLHttpRequest instantiation error'
    };
  })();
};

Цитата:

не совсем понял.
если у меня будет меню из одних спанов, без онклика и вызова функции,
как я тогда укажу - какой пункт меню, какую страницу открывает?
Меню обычно делается как список ссылок. Обработчик навешивается на родительский элемент. При щелчке на ссылке, если не работает js - происходит простой переход по ссылке. Если работает - js отменяет переход и подгружает данные. Техника довольно распространённая, называется event delegation.
Вот пример, не затрагивающий уже существующую разметку:
Код:

function init()
{
  /* ... */
 
  var m = document.getElementById('menu'),
  s = m.getElementsByTagName('span'),
     
  m.addEventListener('click', function(e)
  {
    var name = '';
    switch(e.target || e.srcElement)
    {
      case s[0]:
        name = 'home';
        break;
      case s[1]:
        name = 'installation';
        break;
      case s[2]:
        name = 'contacts';
        break;
      case s[3]:
        name = 'license';
        break;
      default: return true;
    }
   
    loadPage(name);
    (e.preventDefault || function(){ e.returnValue = false; })();
    return false;
  }, false);
};

Можно вместо конструкции switch использовать объект-хеш, в качестве ключей - текст пунктов меню.
P.S. для IE - attachEvent вместо addEventListener.

Дикс 21.06.2008 09:26

почти со всем справился, но вот этот код не отменяет перехода по ссылке ни в одном браузере:

Цитата:

(e.preventDefault || function(){ e.returnValue = false; })();
return false;
просто e.preventDefault () хорошо отменяет переход в ФФ и опере, а в ИЕ6 не работает.
как в ИЕ убить переход?
я повесил обработчик на теги A.

astrologer 21.06.2008 09:59

Цитата:

Сообщение от Дикс
почти со всем справился, но вот этот код не отменяет перехода по ссылке ни в одном браузере:



просто e.preventDefault () хорошо отменяет переход в ФФ и опере, а в ИЕ6 не работает.
как в ИЕ убить переход?
я повесил обработчик на теги A.

Это я перемудрил :)
Код:

if(e.preventDefault)
{
  e.preventDefault();
}
else
{
  e.returnValue = false;
}
return false;


Дикс 21.06.2008 10:30

http://up.giga.su/713746505/
вот сорцы
ИЕ на этот код ваще не реагирует

astrologer 21.06.2008 13:29

В IE события, вопреки стандарту, называются не 'click' или 'keyup', а 'onclick', 'onkeyup' и т.д.
В результате:
Код:

attachEvent('onclick', function(e){/*...*/});
Также [ Element ].attachEvent принимает только два параметра. Третий - булево значение - игнорируется.
Далее.
Функция attachEvent переписывает нативную в IE функцию window.attachEvent. Это не плохо, но нежелательно.

Код:

try          {window.xmlHttp=new XMLHttpRequest();}
  catch (e){ try{window.xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}
  catch (e){ try{window.xmlHttp=new ActiveXObject("MSXML2.XMLHTTP");}
  catch (e){ try{window.xmlHttp=new ActiveXObject("MSXML2.XMLHTTP.3.0");}
  catch (e){ try{window.xmlHttp=new ActiveXObject("MSXML2.XMLHTTP.4.0");}
  catch (e){ try{window.xmlHttp=new ActiveXObject("MSXML2.XMLHTTP.5.0");}
  catch (e){return false;}}}}}}

Ааааа!


Время: 12:21