ファイルアップロードシステムを作るには Dropzone が簡単で便利です。 以下の様な特徴があります。
・jQueryを必要としない。(共存可能です。以下の例ではjQueryと併用します。)
・ドラッグ&ドロップでファイルアップロードが行える
・非同期でファイルアップロードが行える
・ファイルアップロード中の進捗バーを表示することが出来る
使い方は簡単です。
必要なファイルは
dropzone.js (ダウンロード)
dropzone_config.js (自分で作成)
dropzone_upload.php (自分で作成)
dropzone.css (自分で作成)
です。
https://raw.githubusercontent.com/enyo/dropzone/master/dist/dropzone.js ( .jsファイル)
からダウンロードして保存します。
dropzone_config.jsは以下のように作成しておきます (※要追加) のところは適宜追加すること。
$(document).ready(function() {
$('#image_drop_area').dropzone({
url : './js/dropzone_upload.php',
paramName : 'file',
maxFilesize : 999 , //MB
addRemoveLinks : true ,
previewsContainer : '#preview_area' ,
thumbnailWidth : 50 , //px
thumbnailHeight : 50 , //px
dictRemoveFile :'[×]' ,
dictCancelUpload :'キャンセル' ,
dictCancelUploadConfirmation : 'アップロードをキャンセルします。よろしいですか?' ,
uploadprogress:function(file, progress, size){
file.previewElement.querySelector("[data-dz-uploadprogress]").style.width = "" + progress + "%";
},
success:function(file, rt, xml){
// それぞれのファイルアップロードが完了した時の処理(※要追加)
file.previewElement.classList.add("dz-success");
$(file.previewElement).find('.dz-success-mark').show();
},
processing: function(){
// ファイルアップロード中の処理(※要追加)
} ,
queuecomplete: function(){
// 全てのファイルアップロードが完了した時の処理(※要追加)
} ,
dragover: function( arg ){
$('#' + arg.srcElement.id).addClass('dragover');
} ,
dragleave: function( arg ){
$('#' + arg.srcElement.id).removeClass('dragover');
} ,
drop: function( arg ){
$('#' + arg.srcElement.id).removeClass('dragover');
} ,
error:function(file, _error_msg){
var ref;
(ref = file.previewElement) != null ? ref.parentNode.removeChild(file.previewElement) : void 0;
},
removedfile:function(file){
delete_hidden('dropzone_files[]',file.xhr.response);
var ref;
(ref = file.previewElement) != null ? ref.parentNode.removeChild(file.previewElement) : void 0;
} ,
canceled:function(arg){
} ,
previewTemplate : "\
<div class=\"dz-preview dz-file-preview\">\n\
<div class=\"dz-details\">\n\
<div class=\"clearfix\">\n\
<img class=\"dz-thumbnail\" data-dz-thumbnail>\n\
<div class=\"dz-success-mark\" style=\"display:none;\"><i class=\"fa fa-2x fa-check-circle\"></i></div>\n\
</div>\n\
<div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>\n\
<div>\n\
<div class=\"dz-filename\"><span data-dz-name></span></div>\n\
<div class=\"dz-my-separator\"> / </div>\n\
<div class=\"dz-size\" data-dz-size></div>\n\
<div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n\
</div>\n\
</div>\n\
</div>\n\
"
});
});
dropzone_upload.phpは以下のように作成しておきます
<?php
$ds = DIRECTORY_SEPARATOR;
$store_folder = dirname(__FILE__) . $ds . '..' . $ds . 'data' . $ds . 'tmp' . $ds;
// echo $store_folder;
if (!empty($_FILES)) {
$temp_file = $_FILES['file']['tmp_name'];
$ext = get_ext($_FILES['file']['name']); // ファイル名から拡張子を取得
$target_file = basename($_FILES['file']['tmp_name'].$ext);
$ja_file = $_FILES['file']['name'];
$target_file_fullpath = $store_folder . $target_file;
umask(0); // 権限(パーミッション)を厳格にしたい時はこちらを変更
move_uploaded_file($temp_file, $target_file_fullpath);
echo "{$target_file}\t{$ja_file}"; // 英語ファイル名[TAB]日本語ファイル名 を返す
}
//========== _get_ext mime-typeを調べて拡張子を返す
function get_ext($file_name){
$p = pathinfo($file_name);
if ( isset($p['extension']) ){
return '.'.$p['extension'];
}
else{
return '';
}
}
dropzone.cssは以下のように作成しておきます
#image_drop_area {
text-align: center;
padding: 20px 0;
height: 70px;
width: 100%;
color: #666;
background-color: #f9f9f9;
border: 4px dotted #bbb;
}
.dragover {
color: #111 !important;
background-color: #f1f1f1 !important;
border: 4px dotted #777 !important;
}
.dz-preview {
margin: 5px 0;
padding: 10px;
float: left;
background-color: #F5F5F5;
border-radius: 5px;
}
.dz-details {
padding: 0;
}
.dz-filename , .dz-size, .dz-my-separator , .dz-remove {
font: 11px "Lucida Grande", Lucida, Verdana, sans-serif;
}
.dz-filename , .dz-my-separator, .dz-size , .dz-error-message {
float: left;
}
.dz-my-separator {
width: 20px;
text-align: center;
}
.dz-size {
margin-top: 1px;
}
.dz-progress {
width: 500px;
}
.dz-progress .dz-upload {
display: block;
border: 5px solid #1E9BFF;
border-radius: 2px;
}
.dz-remove {
float: left;
margin-left: 5px;
}
.dz-thumbnail {
margin-bottom: 3px;
}
.fa-check-circle:before {
color: #93C54B;
}
.dz-thumbnail , .dz-success-mark {
display: block;
float: left;
}
.dz-success-mark {
height: 25px;
margin-left: 5px;
}
(formタグのactionは dropzone_upload.phpである必要はありません。通常のフォーム送信CGIでOKです。)
<html>
<head>
<meta charset="UTF-8">
<title>dropzone test</title>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="dropzone.js"></script>
<script src="dropzone_config.js"></script>
<link href="dropzone.css" type="text/css" rel="stylesheet" />
</head>
<body>
<form action="XXXXXX.XXX">
<div id="image_drop_area" >ここにアップロードファイルをドロップ</div>
<div id="preview_area" class="dropzone-custom"></div>
</form>
</body>
</html>
以上です。
jQuery Plugin .tmpl()
http://api.jquery.com/jquery.tmpl/
ダウンロードはこちら
https://github.com/jquery/jquery-tmpl
ソースは以下のとおり
手順は
1. jqueryとjquery.tmpl を読み込む 2. テンプレートを定義する(<!-- template -->で囲まれたところ) 3. データを定義する( var data = ..... ; のところ) 4. テンプレートを表示する ( $tmpl ....... のところ )
です。
簡単ですね。
<html> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="jquery.tmpl.min.js"></script> </head> <body> <div id="target"></div> <!-- template --> <script id="template" type="text/x-jquery-tmpl"> <li>${name}</li> </script> <!-- /template --> <script> var data = [ { "name" : "HOGE hofe" }, { "name" : "FUGA fuga" } ]; alert( $.tmpl( $('#template'), data ).html() ); $.tmpl( $('#template'), data ).appendTo( "#target" ); </script> </body> </html>
入力テキストの値を補間するGoogleサジェストライクなプラグイン
デモ
http://logic.moo.jp/livedemo/bootstrap_combo_box/test.html
https://github.com/sutara79/jquery.ajax-combobox/
http://logic.moo.jp/livedemo/jquery_combo_box/mydemo.html
$(function() {
$('#foo').ajaxComboBox(
'mydemo.json',
{
db_table: 'name',
per_page: 20,
navi_num: 10
}
);
});
mydemo.json の中身はこんな感じにします
{
"result":[
{"name":"りんご"},
{"name":"オレンジ"},
{"name":"みかん"},
{"name":"メロン"},
{"name":"グレープフルーツ"},
{"name":"すいか"},
{"name":"もも"},
{"name":"洋梨"},
{"name":"いちご"},
{"name":"マンゴー"}
] ,
"cnt_whole":"10"
}
https://github.com/twitter/typeahead.js/
http://docs.jquery.com/Plugins/Autocomplete
サンプルコード
$(function() {
$("#Keywords").autocomplete('/ajax_suggest.php?flag=amazon', {
delay : 50
}).keydown(function(event){
if( event.keyCode == 13 ){
if( !event.isDefaultPrevented() ){
return false;
}
else{
document.form1.submit();;
}
}
});
});
ドラッグ、ドロップでテーブルやリスト要素を順番変更する【jQuery UI Sortableモジュール】というのがあります。
http://jqueryui.com/demos/sortable/
http://jqueryui.com/download ←ダウンロードはこちら
js
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.8.xxxxx.js"></script>
<script type="text/javascript">
$(function(){
$("#sortable").sortable({
revert: true ,
cursor : 'move' ,
tolerance: 'pointer' ,
update: function(event, ui) {
var data = $("#sortable").sortable("serialize");
var data2 = $('#sortable').sortable('toArray').toString();
alert(data);
alert(data2);
}
})
.disableSelection();
});
<script>
html
<ul id="sortable">
<li id="list_1">ほげほげ</li>
<li id="list_2">ふがふが</li>
<li id="list_3">てすてす</li>
</ul>
とするだけで、<li>要素がドラッグ&ドロップで順番入れ替えできます。
入れ替え後のデータは data(PHP用) , data2(CSV形式) に入るのでそれをプログラムに渡すといいでしょう。
オプションは
revert: true , // アニメーションあり
cursor : 'move' // 移動中は十字カーソルに変更,
tolerance: 'pointer' , // 要素が重なった瞬間に入れ替え判定
がオススメです。
オプションの解説 : http://cly7796.net/wp/javascript/try-the-sortable-of-jquery-ui/
JavaScriptで外部サイト(別ドメイン)のファイルを取得しようとすると、crossdomainの制約にひっかかってエラーとなります。
そこでCross-Domain-Ajaxプラグインを使用します。
これはYahoo Query Language (YQL)を使用してクロスドメインの壁を越えようというものです
(ですのですべてのサイトのデータが取得できるわけではありません)
https://github.com/padolsey/jQuery-Plugins/blob/master/cross-domain-ajax/jquery.xdomainajax.js
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.xdomainajax.js"></script>
<script type="text/javascript">
uri = 'http://www.yahoo.co.jp/';
$.get(uri, function(data){
alert(data.responseText);
});
</script>
appid は各自用意してください。 ajaxメソッドを呼び出していますが、【type:'POST'】は使用出来ません。 【type:'GET'】の時のみ正常に動作します。
// Cross Domain Ajax ajax()メソッド
jQuery.ajax({
url: 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract',
type: 'GET',
data: {
appid : 'XXXXXXXXXX',
sentence : '庭には二羽鶏がいる',
output : 'json'
},
success: function(data) {
alert( jQuery(data.responseText).text() );
}
});
簡単ですね。 おすすめです。
jQueryによるAjax操作の基本
<button type="button" class="btn btn-primary btn-sm" onclick="get_stripe_invoice_json('{{ $v->id }}' , this );">Invoice Json</button>
<textarea class="json_detail" id="ajax_123456789"></textarea>
function get_stripe_invoice_json( id, btn_obj ){
$.ajax({
url: 'ajax取得するURL' ,
type:'GET',
data:{
'id':123456789,
}
})
// on Success
.done( (data,status) => {
json_string = JSON.stringify(data,null, 4);
$('#ajax_' + id).html( json_string ).fadeIn();
})
// on Error
.fail( (data) => {
alert('Ajax Error');
})
}
$("#hoge").html('<p>書き換える要素</p>');
$("#hoge").append('今ある要素のいちばん後ろに追加します');
$("#hoge").load("test.php,null,function(){
alert('読み込み完了');
});
$("#hoge").remove();
$('.hoge').css({
'width' : '100px' ,
'height' : '200px'
});
#contents の中にある .title 要素を取得する場合
$(.title', '#contents'); // ☓ 遅い
$('#contents').find('.title'); // ○ 高速
$(this).parent().find('.myclass'); // 全ての子要素の中から 「myclass」クラスを取得。
$(this).children('.myclass'); // 直下の子要素の中から 「myclass」クラスを取得。孫要素は取得できない
var img_src = $("img").attr("src"); // 取得
$("img").attr("src", "b.jpg"); // 変更
var jq_obj = $('MY_ID');
if ( $(jq_obj).length > 0 ){
alert('jQueryオブジェクトが正しく取得できています。');
}
$(function(){
$('.my_ajax_btn').on('click',function(){
$.ajax({
url:'./request.php',
type:'GET', // GET または post
data:{
'id':$('#userid').val(),
}
})
// on Success
.done( (data) => {
$('.result').html(data);
console.log(data);
})
// on Failed
.fail( (data) => {
$('.result').html(data);
console.log(data);
})
// on Always
.always( (data) => {
});
});
});
Ajax(いわゆる)によってhtmlが動的に書き換えられることが最近多くなってきていると思います。
そこで動的に書き換えられたページを確認するブックマークレット
Kazuho@Cybozu Labs: Ajax な HTML ページのソースコードを表示する
Safari用ブックマークレット
Javascript で書き換えられた後の Webページの内容を表示する (groundwalker.com)
このページで表示されるリンクをブックマークに入れて、Ajaxなサイトに行きページが書き換えられた後にブックマークを起動すると新しいウィンドウでソースコードが表示されます。