Кроссдоменный ajax запрос методом POST [ Cross domain Ajax POST query]

Сразу скажу, что использовать будем curl.
Суть проста: Отправляем данные на локальный скрипт, который принимает переменную и с помощью curl отправляет их на другой сервер. Получает ответ и выдает его в локальный скрипт.

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
            <script type="text/javascript" src="jquery.js"></script>
                <script type="text/javascript">
                var ajax_url = 'http://newdomain.com/ajax.php';
                $(document).ready(function(){
                    $('#link').click(function(){

                        $.post
                        (
                        "proxy.php",
                        {
                            msg: 'wer',
                            target_id: 'sdf'
                        },
                        function(data) {
                          alert(data);
                        });
                    });
                });
            </script>

    </head>
    <body>
        <a href="#" id="link">post cross domain query</a>
    </body>
</html>

Локальный файл, так называемый proxy.php

<?

$url = $_POST['url'];
unset($_POST['url']);

$fields_string = "";

foreach ($_POST as $key => $value)
{
    $fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($_POST));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

$result = curl_exec($ch);

curl_close($ch);
?>

Ну и файл на удаленном сервере ajax.php

<?php

error_reporting(0);

header("Content-type: text/plain; charset=utf-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Connection: close");
//print_r($_POST);
if (!count($_POST))
    die('ERR');
$data = array ();
foreach ($_POST as $k => $v)
    $data[] = $k . '=' . $v;
echo implode('&', $data) . "\nHI from " . $_SERVER['SERVER_NAME'] . '!';
exit;
?>

http://vazelin.org.ua/wp-content/plugins/downloads-manager/img/icons/winrar.gif download: ajax-cross-domain (16.60KB)
added: 16/02/2012
clicks: 35
description:

$.postJSON() или как обойтись без $.getJSON()

Кто использует $.getJSON() знает, что переменные передаются методом GET, а это есть не хорошо.
Предлагаю решение, которое отправляет данные JSON методом POST:

$.postJSON = function(url, data, callback) {
$.post(url, data, callback, "json");
};

Multiupload + jquery sort. (Мульти-аплоад изображений и последующая их сортировка и удаление)

Сегодня поделюсь своей наработкой по загрузке изображений и последующей сортировке.

Для загрузки есть готовое решение: http://www.uploadify.com/demos/

Вот с помощью неё мы и организовали загрузку, но с маленькими ухищрениями, они нужны были для моих целей.

index.php — основной рабочий файл.


<link href="/uploadify/uploadify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="/uploadify/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/uploadify/swfobject.js"></script>
<script type="text/javascript" src="/uploadify/jquery.uploadify.v2.1.4.min.js"></script>

<script type="text/javascript">
 $(function() {
 $.post
 (
 "show_gall.php",
 {
 id : '2'
 },
 function(data) {
 $('#picasso').html(data);
 }
 );

 $('#custom_file_upload').uploadify({
 'uploader'       : '/uploadify/uploadify.swf',
 'script'         : '/uploadify/uploadify.php?id=2',
 'cancelImg'      : '/uploadify/cancel.png',
 'folder'         : '/uploads',
 'multi'          : true,
 'auto'           : true,
 'fileExt'        : '*.jpg;*.gif;',
 'fileDesc'       : 'Image Files (.JPG, .GIF)',
 'queueID'        : 'custom-queue',
 'removeCompleted': true,
 'onSelectOnce'   : function(event,data) {
 $('#status-message').text(data.filesSelected + ' files have been added to the queue.');
 },
 'onAllComplete'  : function(event,data) {
 $.post
 (
 "show_gall.php",
 {
 id : 2
 },
 function(data) {
 $('#picasso').html(data);
 }
 );
 }
});                });

function del(id){
 if (id > 0){
 $.post
 (
 "del_img.php",
 {
 id : id
 },
 function(data) {
 $.post
 (
 "show_gall.php",
 {
 id : '2'
 },
 function(data) {
 $('#picasso').html(data);
 }
 );
 }
 );
 }
 }

</script>

 <style type="text/css">
 #custom-demo .uploadifyQueueItem {
 background-color: #FFFFFF;
 border: none;
 border-bottom: 1px solid #E5E5E5;
 font: 11px Verdana, Geneva, sans-serif;
 height: 50px;
 margin-top: 0;
 padding: 10px;
 width: 350px;
}
#custom-demo .uploadifyError {
 background-color: #FDE5DD !important;
 border: none !important;
 border-bottom: 1px solid #FBCBBC !important;
}
#custom-demo .uploadifyQueueItem .cancel {
 float: right;
}
#custom-demo .uploadifyQueue .completed {
 color: #C5C5C5;
}
#custom-demo .uploadifyProgress {
 background-color: #E5E5E5;
 margin-top: 10px;
 width: 100%;
}
#custom-demo .uploadifyProgressBar {
 background-color: #0099FF;
 height: 3px;
 width: 1px;
}
#custom-demo #custom-queue {
 border: 1px solid #E5E5E5;
 height: 213px;
margin-bottom: 10px;
 width: 370px;
}                </style>
 <div>
 <div id="status-message">Select some files to upload:</div>
<div id="custom-queue"></div>
<input id="custom_file_upload" type="file" name="Filedata" />        </div>

 </div>
 </div>
<div id="picasso">s</div>

В функциях jQuery код, который получает данные из базы о фотках повторяется. Нужно этот код вывести в отдельную функцию.
Теперь, про параметр id: В примере он принимает статическое значение, но на практике оно будет меняться динамически. Это нужно, чтобы фотографии можно было привязать к различным страницам.

Информацию о порядке отображения изображений я буду хранить в базе данных.

CREATE TABLE IF NOT EXISTS `img` (
 `id` int(255) NOT NULL AUTO_INCREMENT,
 `pic` varchar(255) NOT NULL,
 `pr` int(10) NOT NULL,
 `parent_id` int(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=21 ;

Теперь займемся настройкой файла загрузки изображения.
uploadify/uploadify.php


<?php

if (!empty($_FILES)) {
 require '../config/db.php';

 $tempFile = $_FILES['Filedata']['tmp_name'];

$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/'.$_GET['id'].'/';
 $targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

 mkdir(str_replace('//','/',$targetPath), 0755, true);

 move_uploaded_file($tempFile,$targetFile);
 $q = "insert into img set
 pic = '".$_FILES['Filedata']['name']."',
 parent_id = '".intval($_GET['id'])."',
 pr = '0'";
 mysql_query($q);
 echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);

}
?>

С помощью id мы разделяем фотографии с различных страниц в различные папки. Можно вставить еще кроп изображений, проверку на наличие — всё это по вашему вкусу.

Теперь перейдём к отображению и сортировке изображений:

show_gall.php


<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>

<!--[if IE]>
 <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<style>
 article, aside, figure, footer, header, hgroup,
 menu, nav, section { display: block; }

 #sortable { list-style-type: none; margin: 0; padding: 0; }
 #sortable li { margin: 3px 3px 0 0; padding: 1px; float: left; width: 55px; height: 55px;  text-align: center; }
 #sortable li img {padding:1px; border:1px solid #ccc; cursor: pointer; width:50px; height:50px;}

 .ui-state-default, .ui-widget-content .ui-state-default{border:none; background:none;}

 .clear {clear:both;}

</style>

 <div id="reorder-gallery">
 <ul id="sortable">
 <?
 require_once 'config/db.php';
 $id = (int) $_POST['id'];
 $q = "Select * from img where parent_id = '".$id."' order by pr ";

 $r = mysql_query($q);
 while ($row = mysql_fetch_array($r)){
 echo '<li id="'.$row['id'].'"><img src="uploads/'.$row['parent_id'].'/'.$row['pic'].'"/><a href="javascript:;" onClick="del('.$row['id'].');">x</a></li>';
 }
 ?>
 </ul>
 <div></div>
<script>var imgOrder = '';

$(function() {
 $("#sortable").sortable({
 update: function(event, ui) {
 imgOrder = $("#sortable").sortable('toArray').toString();
 $.post
 (
 "update.php",
 {
 c : imgOrder
 },
 function(data) {

 }
 );
 }
 });
 $("#sortable").disableSelection();

});

$(document).ready(function(){
 $("#btnshoworder").click(function(){
 alert(imgOrder);
 });
});

</script>

Сортировка выполняется с помощью функции jQuery UI sortable(), дальше выполняется обновление в базе порядка сортировки.

http://vazelin.org.ua/wp-content/plugins/downloads-manager/img/icons/default.gif download: sortable_multiupload (231.47KB)
added: 09/11/2010
clicks: 362
description: Мультиаплоад и сортировка изображений на лету.

Выбор Страны, облатси и города AJAX

Дамп городов и стран

Пользовательская часть:


<script type="text/javascript">
 function getList(type, obj) {
 $('#loading_' + type).show();
 $.post('/ajax/city.php', {type: type, id: $('#'+obj).val()}, onAjaxSuccess);
 function onAjaxSuccess(data) {
 out = document.getElementById(type);
 for (var i = out.length - 1; i >= 0; i--) {
 out.options[i] = null;
 }
 eval(data);
 $('#loading_' + type).hide();
 }
 }
 </script>

Страна

 <select name="countryid" id="country" onchange="getList('region', 'country')" >

 <option value="4">Австралия</option>
 <option value="63">Австрия</option>
 <option value="81">Азербайджан</option>
 <option value="173">Ангуилья</option>
 <option value="177">Аргентина</option>
 <option value="245">Армения</option>

 <option value="7716093">Арулько</option>
 <option value="248">Беларусь</option>
 <option value="401">Белиз</option>
 <option value="404">Бельгия</option>
 <option value="425">Бермуды</option>
 <option value="428">Болгария</option>

 <option value="467">Бразилия</option>
 <option value="616">Великобритания</option>
 <option value="924">Венгрия</option>
 <option value="971">Вьетнам</option>
 <option value="994">Гаити</option>
 <option value="1007">Гваделупа</option>

 <option value="1012">Германия</option>
 <option value="1206">Голландия</option>
 <option value="2567393">Гондурас</option>
 <option value="277557">Гонконг</option>
 <option value="1258">Греция</option>
 <option value="1280">Грузия</option>

 <option value="1366">Дания</option>
 <option value="2577958">Доминиканская республика</option>
 <option value="1380">Египет</option>
 <option value="1393">Израиль</option>
 <option value="1451">Индия</option>
 <option value="277559">Индонезия</option>

 <option value="277561">Иордания</option>
 <option value="3410238">Ирак</option>
 <option value="1663">Иран</option>
 <option value="1696">Ирландия</option>
 <option value="1707">Испания</option>
 <option value="1786">Италия</option>

 <option value="1894">Казахстан</option>
 <option value="2163">Камерун</option>
 <option value="2172">Канада</option>
 <option value="582029">Карибы</option>
 <option value="2297">Кипр</option>
 <option value="2303">Киргызстан</option>

 <option value="2374">Китай</option>
 <option value="582040">Корея</option>
 <option value="2430">Коста-Рика</option>
 <option value="582077">Куба</option>
 <option value="2443">Кувейт</option>
 <option value="2448">Латвия</option>

 <option value="582060">Ливан</option>
 <option value="2505884">Ливан</option>
 <option value="2509">Ливия</option>
 <option value="2514">Литва</option>
 <option value="2614">Люксембург</option>
 <option value="582041">Македония</option>

 <option value="277563">Малайзия</option>
 <option value="582043">Мальта</option>
 <option value="2617">Мексика</option>
 <option value="582082">Мозамбик</option>
 <option value="2788">Молдова</option>
 <option value="2833">Монако</option>

 <option value="2687701">Монголия</option>
 <option value="582065">Морокко</option>
 <option value="277551">Нидерланды</option>
 <option value="2837">Новая Зеландия</option>
 <option value="2880">Норвегия</option>
 <option value="582051">О.А.Э.</option>

 <option value="582105">Остров Мэн</option>
 <option value="582044">Пакистан</option>
 <option value="582046">Перу</option>
 <option value="2897">Польша</option>
 <option value="3141">Португалия</option>
 <option value="3156">Реюньон</option>

 <option value="3159" >Россия</option>
 <option value="277555">Румыния</option>
 <option value="5647">Сальвадор</option>
 <option value="277565">Сингапур</option>
 <option value="582067">Сирия</option>
 <option value="5666">Словакия</option>

 <option value="5673">Словения</option>
 <option value="5678">Суринам</option>
 <option value="5681">США</option>
 <option value="9575">Таджикистан</option>
 <option value="277567">Тайвань</option>
 <option value="582050">Тайланд</option>

 <option value="582090">Тунис</option>
 <option value="9638">Туркменистан</option>
 <option value="277569">Туркмения</option>
 <option value="9701">Туркс и Кейкос</option>
 <option value="9705">Турция</option>
 <option value="9782">Уганда</option>

 <option value="9787">Узбекистан</option>
 <option value="9908" selected="selected">Украина</option>
 <option value="10648">Финляндия</option>
 <option value="10668">Франция</option>
 <option value="277553">Хорватия</option>
 <option value="10874">Чехия</option>

 <option value="582031">Чили</option>
 <option value="10904">Швейцария</option>
 <option value="10933">Швеция</option>
 <option value="582064">Эквадор</option>
 <option value="10968">Эстония</option>
 <option value="3661568">ЮАР</option>

 <option value="11002">Югославия</option>
 <option value="11014">Южная Корея</option>
 <option value="582106">Ямайка</option>
 <option value="11060">Япония</option>
 </select>

 </td><td>
 регион
 <div style="display: none;" id="loading_region">Загрузка...</div>

 <select name="regionid" id="region" onchange="getList('city', 'region')" >
 <option value="" selected="selected">Укажите регион</option>
 <option value="9909">Винницкая обл.</option><option value="9943">Волынская обл.</option><option value="9964">Днепропетровская обл.</option><option value="10002">Донецкая обл.</option><option value="10061">Житомирская обл.</option><option value="10094">Закарпатская обл.</option><option value="10111">Запорожская обл.</option><option value="10133">Ивано-Франковская обл.</option><option value="10165">Киевская обл.</option><option value="10201">Кировоградская обл.</option><option value="10227">Крымская обл.</option><option value="10259">Луганская обл.</option><option value="10318">Львовская обл.</option><option value="10354">Николаевская обл.</option><option value="10373">Одесская обл.</option><option value="10407">Полтавская обл.</option><option value="10437">Ровенская обл.</option><option value="10455">Сумская обл.</option><option value="10480">Тернопольская обл.</option><option value="277656">Украина</option><option value="10504">Харьковская обл.</option><option value="10535">Херсонская обл.</option><option value="10559">Хмельницкая обл.</option><option value="10583">Черкасская обл.</option><option value="10607">Черниговская обл.</option><option value="10633">Черновицкая обл.</option>

 </select>

 </td><td>
 город
 <div style="display: none;" id="loading_city">Загрузка...</div>

 <select name="city_id" id="city" onChange="javascript:Redirect3(this);">

 <option value="none">Укажите город</option>
 </select>

 </td>

сервеная часть:


<?php
session_start();
 require_once (dirname(dirname(__FILE__)) . '/config/db.php');

$id   = (int)$_POST['id']; // id объекта (страна или регион)
$type = $_POST['type']; // тип списка, который нужно получить (города или регионы)

sleep(1); // спешить нам некуда

if ($type == 'city') {
if ($id < 1){
 echo "out.options[out.options.length] = new Option('Укажите город','none');\n";

 }
 else{
 // выбираем города в данном регионе
 $q = "SELECT *
 FROM city
 WHERE region_id = '".$id."'
 ORDER BY name";
 $r = mysql_query($q);
 echo "out.options[out.options.length] = new Option('укажите город','none');\n";
 if (@mysql_num_rows($r) < 1){
 echo "out.options[out.options.length] = new Option('нет городов','none');\n";
 }
 else{
 while ($city = mysql_fetch_array($r)){
 echo "out.options[out.options.length] = new Option('".$city['name']."','".$city['city_id']."');\n";

 }
 }

 }}

if ($type == 'region') {
 if ($id < 1){
 echo "out.options[out.options.length] = new Option('Укажите регион','none');\n";

 }
 else{

 // выбираем регионы в данной стране
 $q  = "SELECT *
 FROM region
 WHERE country_id = '".$id."'
 ORDER BY name";
 $r = mysql_query($q);
 //echo $q;
 echo "out.options[out.options.length] = new Option('укажите регион','none');\n";
 if (@mysql_num_rows($r) < 1){
 echo "out.options[out.options.length] = new Option('нет регионов','none');\n";
 }
 else{
 while ($region = mysql_fetch_array($r)){
 echo "out.options[out.options.length] = new Option('".$region['name']."','".$region['region_id']."');\n";

 }
 }
}

}
?>

Быстрая проверка правильности e-mail без перезагрузки страници

С возможностями jQuery уже давно использовать jsHttpRequest не имеет смысла. Все аякс запросы можно делать с помощью jquery (.post(); .get()). Для аякс запросов через субдомены, можно использовать jsonp.

В этот раз, я расскажу как можно сделать динамическую проверку валидности электронного ящика.

Для этого мы будем использовать готовую библиотеку jsHttpRequest.

Ее вам нужно будет скачать на сайте разработчика. Забегая наперед скажу — библиотека позволяет создавать Ajax запросы без написания Ajax-а :)

Read more

AJAX и «кириллические символы»

Столкнулся с проблемой, есть скрипт, который добавляет с помощью формы запись в таблицу используя AJAX. Так вот, во всех браузерах, кроме IE кириллические символы добавляются без проблем, а вот ИЕ «глючит» с кодировкой.
Решение нашлось простое — использование функции

1
encodeURI()

Теперь, пред тем, как мы отправляем переменную исполняющему файлу, мы просто кодируем кириллицу

1
2
3
4
5
6
7
8
9
10
11
...............................
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
  {
  alert ("Browser does not support HTTP Request");
  return;
  }
var url="ins.php";
str=encodeURI(str);
url=url+"?q="+str;
.........