Показаны сообщения с ярлыком javascript. Показать все сообщения
Показаны сообщения с ярлыком javascript. Показать все сообщения

22 февраля 2012

AJAX тройной выпадающий список (triple select)

Опишу очень простую реализацию трех выпадающих списков, данные которых связанны последовательно. Выглядит это примерно так "Город" -> "Улица" -> "Дом". После выбора дома, на основе AJAX запроса, генерируется список улиц этого города, а после выбора улицы генерируется список домов на этой улице. Создадим html файл:

index.html
City:
Street:
Build:

При выборе города срабатывает функция getStreet, которая генерирует код списка улиц. Добавим ниже javascript:

Теперь проделаем то же само для выбора улицы, добавим функции:
function getBuild(sel) {
    //If our XmlHttpRequest object is not in the middle of a request, start the new asyncronous call.
    var value = sel.options[sel.selectedIndex].value;
    if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
        //Setup the connection as a GET call to SayHello.html.
        //True explicity sets the request to asyncronous (default).
        receiveReq.open("GET", "/ajax/get_ajax_build?street="+value, true);
        //Set the function that will be called when the XmlHttpRequest objects state changes.
        receiveReq.onreadystatechange = handleBuild;
        //Make the actual request.
        receiveReq.send(null);
    }
}

//Called every time our XmlHttpRequest objects state changes.
function handleBuild() {
    //Check to see if the XmlHttpRequests state is finished.
    if (receiveReq.readyState == 4) {
        //Set the contents of our span element to the result of the asyncronous call.
        //document.getElementById('span_result').innerHTML = receiveReq.responseText;
        //alert(receiveReq.responseText);
        document.getElementById('buildAJAX').innerHTML = receiveReq.responseText;
        summAddress();
    }
}

Все должно работать :) Осталось написать функции на стороне сервера, для AJAX запросов. Тут их две get_ajax_build и get_ajax_street. Обе возвращают обычный HTML списсок формата:

У меня на питоне они выглядят так:
def get_ajax_street(self):
        city = request.GET['city']
        streets = s.query(Streets).filter(Streets.city==city).\
                order_by(Streets.name).all()
        html = ''
        for street in streets:
            html += "\n" % (street.name or 'No name')

        if html:
            html = ""

        return html

    def get_ajax_build(self):
        street = request.GET['street']
        builds = s.query(Builds).filter(Builds.streetid==street).\
                order_by(Builds.building).all()
        html = ''
        for build in builds:
            html += "\n" % (build.building or 'No name')

        if html:
            html = ""

        return html
Выглядит это как-то так:


Думаю понятно, что функции должны быть доступны по адресам /ajax/get_ajax_street и /ajax/get_ajax_build соответственно.
Пользуйтесь )

10 февраля 2012

Пример карты OpenStreetMap на своем сайте

OpenStreetMap — это свободно редактируемая карта всего мира. Она сделана такими же людьми, как и вы. OpenStreetMap позволяет совместно просматривать, изменять и использовать географические данные в любой точке Земли. Также позволяет накладывать разные слои в том числе и карты Яндекса с Гуглом. У гугла проблема с детализацией карт в России у Яндекса с API поэтому OpenStreetMap смотрится наиболее красивым решением, при том что софт и сами карты распространяются по свободным лицензиям.

Добавим js



На карте добавлени слой "Equipments" и маркер с картинкой switch_svg.gif

На странице вставляем тег карты

И в тег <body> добавляем onload="GetMap();"

Результат:
OpenStreeMap пример

Хорошая статья на Хабре

13 ноября 2011

Красивые графики javascriptRRD + Float

В продолжение статьи Python + Tornado + RRDTool: температура на улице и в серверной рассмотрим как можно рисовать rrd используя только javascript на стороне клиента. Результат будет такой:
Используем библиотеку javascriptrrd. Качаем и добавляем следующие файлы из нее в наш шаблон в <head>
<script type="text/javascript" src="media/js/lib/binaryXHR.js"></script>
    <script type="text/javascript" src="media/js/lib/rrdFile.js"></script>

    <!-- rrdFlot class needs the following four include files !-->
    <script type="text/javascript" src="media/js/lib/rrdFlotSupport.js"></script>

    <script type="text/javascript" src="media/js/lib/rrdFlot.js"></script>
    <script type="text/javascript" src="media/flot/jquery.js"></script>
    <script type="text/javascript" src="media/flot/jquery.flot.js"></script>
    <script type="text/javascript" src="media/flot/jquery.flot.selection.js"></script>
    <script type="text/javascript" src="media/flot/jquery.flot.tooltip.js"></script>

И саму js функцию для отрисовки
<br><h2>javascriptRRD пример</h2>
    <table id="infotable" border=1>
        <tr><td colspan="21"><b>Javascript needed for this page to work</b></td></tr>
 <tr><td><b>RRD file</b></td><td id="fname" colspan="5">None</td></tr>
    </table>

    <div id="mygraph"></div>

    <script type="text/javascript">

      // Remove the Javascript warning
      document.getElementById("infotable").deleteRow(0);

      // fname and rrd_data are the global variable used by all the functions below
      fname="media/temperature.rrd";
      rrd_data=undefined;

      // This function updates the Web Page with the data from the RRD archive header
      // when a new file is selected
      function update_fname() {
        // Finally, update the file name and enable the update button
        document.getElementById("fname").firstChild.data=fname;

        var graph_opts={legend: { noColumns:4}};
        var ds_graph_opts={'Oscilator':{ color: "#ff8000", 
                                         lines: { show: true, fill: true, fillColor:"#ffff80"} },
                           'Idle':{ label: 'IdleJobs', color: "#00c0c0", 
                                    lines: { show: true, fill: true} },
                           'Running':{color: "#000000",yaxis:2}};

        

        // the rrdFlot object creates and handles the graph
        var f=new rrdFlot("mygraph",rrd_data,graph_opts,ds_graph_opts);
      }
 
      // This is the callback function that,
      // given a binary file object,
      // verifies that it is a valid RRD archive
      // and performs the update of the Web page
      function update_fname_handler(bf) {
          var i_rrd_data=undefined;
          try {
            var i_rrd_data=new RRDFile(bf);            
          } catch(err) {
            alert("File "+fname+" is not a valid RRD archive!");
          }
          if (i_rrd_data!=undefined) {
            rrd_data=i_rrd_data;
            update_fname()
          }
      }

      // this function is invoked when the RRD file name changes
      function fname_update() {
        fname="media/temperature.rrd";
        try {
          FetchBinaryURLAsync(fname,update_fname_handler);
        } catch (err) {
           alert("Failed loading "+fname+"\n"+err);
        }
      }

    </script>

Для автоматического запуска функции при загрузки страницы добавим событие onLoad в body
<body bgcolor="white" text="black" onLoad="fname_update()">
Всё, радуемся результату.