Архив за Август 2008

Определение даты создания изображения

Открыв любой JPEG-файл, можно обнаружить, что среди бинарных данных дата записывается в текстовом формате, например, 2008:08:06 22:32:05. Таким образом, для определения даты создания или редактирования JPEG-файла достаточно открыть его и найти дату при помощи регулярного выражения:

<?php
  $filename = 'flowers.jpg';
  // Помещаем содержимое файла в переменную $content
  $content = file_get_contents($filename);
  // Извлекаем дату
  preg_match('|([\d]{4}:[\d]{2}:[\d]{2} [\d]{2}:[\d]{2}:[\d]{2})|i', $content, $out);
  echo $out[0];
?>

Ограничение количества вводимых символов для textarea

Для элементов input доступно такое свойство, как maxlength, которое позволяет ограничить количество вводимых в эти поля символов. Однако для textarea такой атрибут не существует, и поэтому для ограничения ввода нужно использовать JavaScript.

<script type="text/javascript">
function limitText(limitField, limitCount, limitNum) {
    if (limitField.value.length > limitNum) {
        limitField.value = limitField.value.substring(0, limitNum);
    } else {
        limitCount.value = limitNum - limitField.value.length;
    }
}
</script>

Пример использования функции:

<form name="myform">
<textarea name="message" onKeyDown="limitText(this,this.form.count,20);"
onKeyUp="limitText(this,this.form.count,20);">

</textarea><br />
<span style="font-size:smaller">(не более 20 символов)</span><br/>
<input readonly type="text" name="count" size="3" value="20"/> символов осталось.
</form>

Так можно поступить и с обычной строкой ввода (type=”text”).

Общее представление об AJAX. Часть 6

Извлечение HTTP-заголовков

Метод getAllResponseHeaders() объекта XMLHttpRequest возвращает все HTTP-заголовки, полученные от сервера, тогда как метод getResponseHeader() - только один конкретный заголовок. В слуедующем фрагменте кода демонстрируется, каким образом извлекается информация о типе используемого Web-сервера:

var XMLHttp = getXMLHttp();
XMLHttp.open("GET", "sometext.txt", true);
XMLHttp.onreadystatechange = handlerFunction;
XMLHttp.send(null);

function handlerFunction() {
  if (XMLHttp.readyState == 4) {
    var servertype = XMLHttp.getResponseHeader("Server");
    window.alert("Web server used: " + servertype);
  }
}

function getXMLHttp() {
  var XMLHttp = null;
  if (window.XMLHttpRequest) {
    try {
      XMLHttp = new XMLHttpRequest();
    } catch (e) { }
  } else if (window.ActiveXObject) {
    try {
      XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) { }
    }
  }
  return XMLHttp;
}

Получение XML-данных от сервера

Свойство responseText отлично подходит для обработки ограниченного количества неструктурированных данных. Однако более более изящный подход к обработке сложных, структурированных данных в приложении AJAX предоставляет свойство responseXML. При обращении к этому свойству будет получен ответ на запрос HTTP в виде объекта XML DOM языка JavaScript, но при условии, что сервер возвращает действительные данные XML. в противном случае будет получено пустое значение null.

Доступ к подобным данным объекта XML осуществляется таким же образом, как и к элементам DOM из кода JavaScript. Для данного примера кода используется следующий XML-файл books.xml:

<books>
  <book pubdate="2006">
    <title>JavaScript Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
  <book pubdate="2006">
    <title>MySQL Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
  <book pubdate="2005">
    <title>PHP Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
</books>

Для того, чтобы браузеры могли прочитать этот XML-файл (особо строгими правилами в этом отношении отличается Internet Explorer), клиенту должен быть отправлен правильный тип MIME, а именно: text/xml. Этот тип указывается в свойстве mime.types файла конфигурации Apache.

С другой стороны, сценарий на сервере может сам предоставить файл с правильным типом MIME:

<?php
header('Content-type: text/xml');
readfile('books.xml');
?>

В следующем фрагменте кода осуществляется доступ к данным из XML-файла с использованием структуры DOM:

var XMLHttp = getXMLHttp();
XMLHttp.open("GET", "books.xml", true);
XMLHttp.onreadystatechange = handlerFunction;
XMLHttp.send(null);

function handlerFunction() {
  if (XMLHttp.readyState == 4) {
    var xml = XMLHttp.responseXML;
    var book = xml.getElementsByTagName("book");
    for (var i=0; i<book.length; i++) {
      var pubdate = book[i].getAttribute("pubdate");
      var title, publisher;
      for (var j=0; j<book[i].childNodes.length; j++) {
        if (book[i].childNodes[j].nodeName == "title") {
          title = book[i].childNodes[j].firstChild.nodeValue;
        } else if (book[i].childNodes[j].nodeName == "publisher") {
          publisher = book[i].childNodes[j].firstChild.nodeValue;
        }
      }
      window.alert(title + " by " + publisher + " (" + pubdate + ")");
    }
  }
}

function getXMLHttp() {
  var XMLHttp = null;
  if (window.XMLHttpRequest) {
    try {
      XMLHttp = new XMLHttpRequest();
    } catch (e) { }
  } else if (window.ActiveXObject) {
    try {
      XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) { }
    }
  }
  return XMLHttp;
}

Ссылки по теме: