→

Шпаргалки →  Загрузка файла при помощи Ajax

Как отправить файл на сервер аяксом.

Имеем форму:
<form method='post' enctype='multipart/form-data'>
<input type="file" id="imf" name="imf"/>
<input type="button" id="Save"/>
</form>

Отправляем методом пост содержимое файла и имя файла. Замечу, что данные придут в переменной $_POST. Далее, используя fwrite пишем файл, куда надо.
$("#Save").live("click", function(){

var photo = document.getElementById("imf");
var file  = photo.files[0];

   $.post('/user/saveNewPhoto', {'imf':file.getAsDataURL(), fname:file.fileName }, function( data ){
   alert ( data );
    });

});

На больших файлах не опробовано.
2
1

Шпаргалки →  Конвертирование UTC в человеческую дату на JavaScript

function timeToHuman(x){
var theDate = new Date();
theDate.setTime(parseInt(x)); //this would remove the millisecond part of it.

var dateString = theDate.toGMTString(); //guessing you'll now have the date in string format here. To get individual elements...

var arrDateStr = dateString.split(" ");
var month = getMonthNum(arrDateStr[2]);
var day = arrDateStr[1];
var year = arrDateStr[3];
var hour = arrDateStr[4].substr(0,2);
var minute = arrDateStr[4].substr(3,2);
var second = arrDateStr[4].substr(6,2);
if (x==0) return ("");
else return (day+ '/' + month + '/' + year + ' ' + hour + ':' + minute + ':' + second)
}

function getMonthNum(abbMonth){
var arrMon = new
Array("Jan","Feb","Mar","Apr","May","Jun","Jul","A ug","Sep","Oct","Nov","Dec");
var i;
for(i=0; i<arrMon.length; i++)
{
if(abbMonth == arrMon[i])
return i+1;
}
return -1;
}
2

JavaScript программирование →  Добавить страницу в избранное

Работает это в следующих браузерах:
Internet Explorer (Win), FireFox (Win/Mac), Opera (Win), Netscape (Win/Mac), Mozilla (Mac)

Не работает в Safari (Win/Mac). Тех кто знает решение — жду в личке или в комментах.
Вернее в Safari выдает пользователю сообщение: «Что бы добавить страницу в избранное нажмите CTRL-D.»
Ну или Command-D — в зависимости от платформы.

function bookmark(title, url) {
        if (title == undefined)
                title = document.title;
        if (url == undefined)
                url = top.location.href;
        if (window.sidebar) {
                // Firefox
                window.sidebar.addPanel(title, url, '');
        } else if (window.opera && window.print) {
                // Opera
                var t = document.createElement('a');
                t.setAttribute('rel', 'sidebar');
                t.setAttribute('href', url);
                t.setAttribute('title', title);
                t.click();
        } else if(window.external ) {
                // IE
                window.external.AddFavorite(url, title);
        }
        else {
//сюда уже проверку сами вставите, хотя, по идее это условие никогда не выполнится
//но для надежности пусть будет
                alert('Что бы добавить страницу в избранное нажмите CTRL-D.');
        }
        return false;
}
 
if (window.external || window.sidebar || (window.opera && window.print)) {
        document.write('<a href="/#"  onclick="bookmark(\'Сайт о веб-программировании\',
\'http://php5.com.ua\'); return false;">Добавить в избранное<\/a>'
);
}
else {
//проверяем макинтош это или писюк
        this.agent = navigator.userAgent;
        this.mac = this.agent.indexOf("Mac")>-1;
//для макинтоша соответственно выводим
        if (this.mac) document.write('Что бы добавить страницу в избранное нажмите Command-D.');
//для PC выводим
        else document.write('Что бы добавить страницу в избранное нажмите CTRL-D.');
}
3

JavaScript программирование →  Оптимизация загрузки JavaScript файлов на веб-странице (асинхронная загрузка скриптов)

Привет, умники:)
Сегодня мы будем заниматься дрочерством, а именно — оптимизировать загрузку HTML страницы. В наше время информационных технологий без JavaScript в веб-разработке никуда. И чем дальше, тем больше нагружаются страницы этим самым яваскриптом. Как известно, объявление js файлов лежит у нас в
<head>
. И, пока не подтянутся эти js файлы, загрузка страницы блокируется, если их много, то это может быть не очень приятным моментом. Что делать?

Создаем функцию загрузки js файла. А-ля include:
function include(url, callback){

    var script = document.createElement("script")
    script.type = "text/javascript";

    if (script.readyState){  //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function(){
            callback();
        };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

И ложим ее в файлик include.js.
Далее после тега
</body>
прописываем наш скрипт include.js и загрузку необходимого нам js файлов.

<script type="text/javascript" src="http://your.com/include.js"></script>
<script type="text/javascript">
include("http://your.com/main.js", function(){
    //initialization code
});
</script>


Прикол в том, что все сводится к этим двум файлам include.js и main.js и мы имеем два http запроса. Скорее всего у вас на странице больше двух js файлов, тогда необходимо провести предварительную подготовку при помощи Sprockets, mod_concat или combo handler, сведя все файлы к main.js

Зачем добавлять именно после тега
</body>
. Будет гарантия что мы получим все необходимые нам DOM элементы и не нужно использовать window.onload.

И еще, для фанатов JQuery. Он тоже так умеет http://docs.jquery.com/Ajax/jQuery.getScript.
2

JavaScript программирование →  Мягкий (smooth) cкролл (прокрутка, scroll) окна (блока) при помощи JQuery


function enable_smooth_scroll() {
    function filterPath(string) {
        return string
                .replace(/^\//,'')
                .replace(/(index|default).[a-zA-Z]{3,4}$/,'')
                .replace(/\/$/,'');
    }

    var locationPath = filterPath(location.pathname);
   
    var scrollElement = 'html, body';
    $('html, body').each(function () {
        var initScrollTop = $(this).attr('scrollTop');
        $(this).attr('scrollTop', initScrollTop + 1);
        if ($(this).attr('scrollTop') == initScrollTop + 1) {
            scrollElement = this.nodeName.toLowerCase();
            $(this).attr('scrollTop', initScrollTop);
            return false;
        }    
    });
   
    $('a[href*=#]').each(function() {
        var thisPath = filterPath(this.pathname) || locationPath;
        if  (   locationPath == thisPath
                && (location.hostname == this.hostname || !this.hostname)
                && this.hash.replace(/#/, '')
            ) {
                if ($(this.hash).length) {
                    $(this).click(function(event) {
                        var targetOffset = $(this.hash).offset().top;
                        var target = this.hash;
                        event.preventDefault();
                        $(scrollElement).animate(
                            {scrollTop: targetOffset},
                            500,
                            function() {
                                location.hash = target;
                        });
                    });
                }
        }
    });
}
 


Что делать с функцией


В html прописываем:

<script>
$(document).ready(function() {
    enable_smooth_scroll();
});
</script>
<a href="#fuck">ХУЙ</a>
<div id="fuck"></div> <!-- Размещаем блок в качестве якоря туда, куда нужно крутить. Это не обязательно должен быть div -->
 


UPD: http://demo.php5.com.ua/smooth-scroll/ добавил демо

--
На правах рекламы: Уроки по фотошоп
--
1
10

JavaScript программирование →  JS Функция для получения случайного цвета

Столкнулся с необходимостью получения случайного цвета в Java Script.

Задача была сделать логотип на сайте Антилебедева, как в оригинале.

Нашел одно решение, которое достойно говнокода.

Так же нашлось более изящное решение.

// @format (hex|rgb|null) : Format to return, default is integer
function random_color(format)
{
 var rint = Math.round(0xffffff * Math.random());
 switch(format)
 {
  case 'hex':
   return ('#0' + rint.toString(16)).replace(/^#0([0-9a-f]{6})$/i, '#$1');
  break;
 
  case 'rgb':
   return 'rgb(' + (rint >> 16) + ',' + (rint >> 8 & 255) + ',' + (rint & 255) + ')';
  break;
 
  default:
   return rint;
  break;
 }
}


Ну, если нужен только HEX, то можно вот так:

(Math.round(0xFFFFFF * Math.random()).toString(16) + "000000").replace(/([a-f0-9]{6}).+/, "#$1").toUpperCase();
0

JavaScript программирование →  Селекторы в JQuery в примерах

Для опытов соорудим html страницу:

<div id="header">
    <h1><a href="/" title="homepage">Title</a></h1>
    <h2>Sub-title <span>small description</span></h2>
</div>
<div id="wrapper">
    <div id="content">
        <div class="post">
            <h3>Post Title</h3>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
            <span>Image Title</span>
            <img src="/image1.jpg" alt="Image Alt Text"/>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
            <span class="inner-banner">Banner Text</span>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
        </div>
        <span id="banner"><img src="/banner1.jpg" alt="Big Banner"/></span>
        <div class="post">
            <h3>Post Title</h3>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
            <span>Image Title</span>
            <img src="/image2.jpg" alt="Image Alt Text"/>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
            <span class="inner-banner">Banner Text</span>
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien.
               Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien,
               vel varius augue tortor vel tortor.</p>
        </div>
    </div>
</div>
<div id="sidebar">
    <ul>
         <li><a href="/item0.html">Menu Item 0</a></li>
         <li><a href="/item1.html">Menu Item 1</a></li>
         <li><a href="/item2.html">Menu Item 2</a></li>
         <li><a href="/item3.html">Menu Item 3</a></li>
    </ul>
</div>
<div id="footer">
    Copyright 2008
</div>
 


Выбор элементов по Id либо ClassName:

$('#sidebar');    // выбор элемента с id = sidebar
$('.post');       // выбор элементов с class = post
$('div#sidebar'); // выбор элемента div с id = sidebar
$('div.post');    // выбор элементов div с class = post


Иерархия объектов в DOM



Выборка деток:

$('div span');            // выбор всех span элементов в элементах div


Аналогичный результат можно получить используя следующую конструкцию:

$('div').find('span');    // выбор всех span элементов в элементах div


Выборка только непосредственных деток:

$('div > span');          // выбор всех span элементов в элементах div, где span является прямым потомком div'a


Группируем селекторы:

$('div, span');          // выбор всех div и span элементов


Ищем по соседям:

$('span + img');         // выбор всех img элементов перед которыми идут span элементы
$('span ~ img');         // выбор всех img элементов после первого элемента span
$('#banner').prev();     // выбор предыдущего элемента от найденого
$('#banner').next();     // выбор следующего элемента от найденого


Выборка всех элементов, всех родителей, всех деток:

$('*');                // выбор всех элементов
$('p > *');            // выбор всех потомков элементов p
$('p').children();     // --
$('p').parent();       // выбор всех прямых предков элементов p
$('* > p');            // выбор всех предков элементов p (скорей всего Вам не понадобится)
$('p').parents();      // --
$('p').parents('div'); // выбор всех предков элемента p которые есть div (parents принимает в качестве параметра селектор)


Фильтры



Фильтров в jQuery реализовано достаточно много:

$('div:first');     // выбираем первый div в доме
$('div:last');      // выбираем последний div в доме
$('div:not(.red)'); // выбираем div'ы у которых нету класса red
$('div:even');      // выбираем четные div'ы
$('div:odd');       // выбираем нечетные div'ы
$('div:eq(N)');     // выбираем div идущим под номером N в DOMe
$('div:gt(N)');     // выбираем div'ы, индекс которых больше чем N в DOMe
$('div:lt(N)');     // выбираем div'ы, индекс которых меньше чем N в DOMe
$(':header');       // выбо заголовоков h1, h2, h3 и т.д.
$('div:animated');  // выбор элементов с активной анимацией


Фильтры по контенту и видимости:

$('div:contains(text)'); // выбираем div'ы содержащие текст
$('div:empty');          // выбираем пустые div'ы
$('div:has(p)');         // выбираем div'ы которые содержат p
$('div.red').filter('.bold') // выбираем div'ы которые содержат класс red и класс bold
$('div:hidden');         // выбираем скрытые div'ы
$('div:visible');        // выбираем видимые div'ы


Фильтры по атрибутам:

$("div[id]");           // выбор всех div с атрибутом id
$("div[title='my']");   // выбор всех div с атрибутом title=my
$("div[title!='my']");  // выбор всех div с атрибутом title не равного my
$("div[title^='my']");  // выбор всех div с атрибутом title начинающихся с my
                        // <div title="myCat">,<div title="myCoffee">, <div title="my...">
$("div[title$='my']");  // выбор всех div с атрибутом title заканчивающихся на my
                        // <div title="itsmy">,<div title="somy">, <div title="...my">
$("div[title*='my']");  // выбор всех div с атрибутом title содержащим my
                        // <div title="itsmy">,<div title="myCat">, <div title="its my cat">,<div title="...my...">


Стоит отдельно отметить следующий фильтр:

$("a[rel~='external']"); // выбор всех A с атрибутом rel содержащим external в списке значений разделенных пробелом


В результате его работы будут выбраны следующие теги:

<a href="" rel="external">link</a> — да
<a href="" rel="nofollow external">link</a> — да
<a href="" rel="external nofollow">link</a> — да
<a href="" rel="friend external follow">link</a> — да
<a href="" rel="external-link">link</a> — нет


Для работы с элементами форм есть ряд селекторов позволяющий выбирать по типу элемента и фильтров — enabled/disabled/selected/checked:

$(":text");            // выбор всех input элементов с типом =text
$(":radio");           // выбор всех input элементов с типом =radio
                       // и так далее
$("input:enabled");    // выбор всех включенных элементов input
$("input:checked");    // выбор всех отмеченных чекбоксов


Группируем фильтры:

$("div[name=city]:visible:has(p)"); // выбор видимого div'a с именем city, который содержит тег p


Полезные селекторы для работы с элементами форм:

$("form select[name=city] option:selected").val(); // получение выбранного(-ых) элементов в селекте city
$("form :radio[name=some]:checked").val(); // получение выбранного значения радиобатона с именем some
$("form :checkbox:checked"); // выбор всех выбранных чекбоксов


Работа с элементом SELECT



Удалить все элементы списка:

$('select[@name=mySelect] option').remove();


Добавить в список новый элемент:

$('select[@name=mySelect]').append('<option>Новый элемент списка</option>');


Например, список формируется из XML данных таким образом:

$(xml).find('file').each( function(){
        $('select[@name=loadFileName]').append('<option>'+$(this).find('title').text()+'</option>');
});


Схема здесь проста: мы ищем все теги , обрабатываем их с помощью .each() — находим и загоняем текст в следующий пункт списка.

Сделать выделенным первый пунки списка:

$('select[@name=loadFileName] option:first').attr('selected', 'yes');


Принудительно снять выделение с элемента списка:

$('select[@name=loadFileName] option:first').removeAttr('selected');


Получить значение выделенного пункта из списка:

Тут есть два варианта. Первый, если вы используете аттрибут <option value=«some value»>:

var file = $('select[@name=loadFileName] option:selected').val();


И второй вариант: вы не задаете value, вас интересует то, что заключено между … (как у меня в проекте):

var file = $('select[@name=loadFileName] option:selected').text();
 

Теперь переменная file содержит нужное нам значение.

Проверить, выбран ли какой-нибудь элемент списка. Это нужно делать обязательно, иначе в приложении могут возникнуть проблемы:

if( typeof $('select[@name=loadFileName] option:selected').text() === 'undefined' ){
       alert('Ни один элемент списка не выбран');
}


Превратить список в «автомасштабируемый, т.е. отобразить в списке ровно столько элементов, сколько в нем есть:

$('select[@name=loadFileName]').attr('size', $('select[@name=loadFileName] option').size());


Сделать недоступны для выбора отдельный элемент:

$('select[@name=loadFileName] option:contains('текст нужного элемента')').attr('disabled', 'disabled');


Разрешить выделение всех ранее недоступных элементов можно так:

$('select[@name=loadFileName] option:disabled').removeAttr('disabled');
0
2

Блог им. igorok →  У кого сколько в пятнашки?

Выложил пятнашки на JQuery
У меня получилось 74.
А у вас?
Только честно:)
0

JavaScript программирование →  Jquery UI: sortable и сохранение позиции айтема

Как по мне, документация к JQuery достаточно сыроватая и неудобная. Для того что бы разобраться с документацией по UI, необходимо достаточно много пописать использованием JQuery, т.е. дойти до такого уровня, когда документация уже не нужна:)
Рассмотрим юзер интерфейс Sortable. Исходя из документации и примера, все кажется понятным, проблемы и непонятки могут возникнуть в случае, когда возникнет необходимость сохранить последовательность наших айтемов.

Решение:

<style>
  #test-list { list-style: none; padding: 0; margin: 0 40px; }
  #test-list li { margin: 0 0 10px 0; background: #eaf3fa; padding: 15px; }
  #test-list .handle { float: left; margin-right: 10px; cursor: move; }
  #test-log { padding: 5px; border: 1px solid #ccc; }
</style>
<script type="text/javascript" src="{ latest jquery release }"></script>
<script type="text/javascript" src="{ ui core }"></script>
<script type="text/javascript" src="{ ui sortable }"></script>
<script type="text/javascript">
  // When the document is ready set up our sortable with it's inherant function(s)
  $(document).ready(function() {
    $("#test-list").sortable({
      handle : '.handle',
      update : function () {//здесь делаем действие, которое нам нужно, например аяксовый вызов сохранения
        $("input#test-log").val($('#test-list').sortable('serialize'));
      }
    });
});
</script>
<ul id="test-list">
  <li id="listItem_1"><img src="arrows.png" class="handle" alt="move" />Item 1 with a link to <a href="http://www.google.co.uk/" rel="nofollow">Google</a></li>
  <li id="listItem_2"><img src="arrow.png" class="handle" alt="move" />Item 2</li>
  <li id="listItem_3"><img src="arrow.png" class="handle" alt="move" />Item 3</li>
  <li id="listItem_4"><img src="arrow.png" class="handle" alt="move" />Item 4
    <p>Perhaps you want to add a form in here?</p>
    <p>Text:<br /><input type="text" /></p>
    <p>And a textarea<br /><textarea></textarea></p>
  </li>
</ul>
<label for="test-log"><strong>Resultant order of list</strong></label>
<input type="text" size="70" id="test-log" />


В данном примере данные сириализуются и заносятся в текстовое поле с id=«test-log»
0
←  сюда    туда  →
1 2