【jQuery】JavaScript ライブラリ総合質問所 vol.2at HP
【jQuery】JavaScript ライブラリ総合質問所 vol.2 - 暇つぶし2ch596:Name_Not_Found
13/03/02 01:32:15.30
>>594
B処理を関数にしてA処理の最後でそれを呼び出す。

597:593
13/03/02 01:59:11.33
>>595
ありがとうございました。

598:Name_Not_Found
13/03/02 03:22:23.23 EJS1Q+DQ
jQueryMobileで質問なのですが、
data-rel="dialog"で開いたダイアログに入力フォームを作ります。
ダイアログに登録ボタンを作ります。
その登録ボタンを押したタイミングで
入力フォームの入力値を呼び元(親画面)の要素に渡したいのですが
どのように書いたらいいのでしょうか。。

599:Name_Not_Found
13/03/02 04:27:06.27
>>596
すみません書き方が悪かったです。もう少し詳しく書きますと
実は非同期通信のアップロード掲示板が作りたくて、
フォーム送信時にeach関数を使ってinput要素を順に取得し、その中でfile属性があった場合
jquery.uploadを使ってファイルアップロードしようと試みていました。

$("form").submit(function() {
var postData = {};
$(this).find('input').each(function() {
if ($(this).prop('type') == 'radio' || $(this).prop('type') == "checkbox") {
if ($(this).is(':checked')) {
postData[$(this).prop('name')] = $(this).val();
}
} else if ($(this).prop('type') == 'file') {
$(this).upload('upload.php', function(res) {
postData[$(this).prop('name')] = res.file; // ※1 アップしたファイル名を返す
}, 'json');
} else {
postData[$(this).prop('name')] = $(this).val();
}
});
$.post('script.php', postData, function(data) { ※2
// 書き込み後処理
});
return false;
});

上記のようなソースなのですが、※1で代入されたファイル名を※2でPOST送信したいのです。
本当はフォームデータをまとめてuploadに乗っけて送信しても良いのですが、出来たら分けて送信したいと思っています。
何か良い方法ありましたら教えてください。

600:Name_Not_Found
13/03/02 06:09:37.14 Qy9BQwQn
 

601:Name_Not_Found
13/03/02 08:54:22.70
※1で代入されたファイル名を使ってPOSTしたいなら
※1での処理ブロックでまとめないと。

ajaxでの処理をおこなう場合は、ajaxの処理結果の
success/failを処理する関数内でまとめる必要がある。

あとは、$.Defferedとpipeをつなげると幸せになれるかも。

602:Name_Not_Found
13/03/02 18:13:25.23 Ml0q1x8G
 

603:596
13/03/02 21:47:12.93
>>599
※2よりもあとに※1が動くだろうからそういう書き方は無理やね。
>>601 がいうようにDeffered でなんとかなると思うけど、>>596 のやり方でやるんならこんなのはどうか

$("form").submit(function () {
var postData = {};
var count = 0;
$(this).find('input').each(function () {
~略~
} else if ($(this).prop('type') == 'file') {
count++;
$(this).upload('upload.php', function (res) {
postData[$(this).prop('name')] = res.file; // ※1 アップしたファイル名を返す
count--;
post();
}, 'json');
~略~
});
function post() {
if (count > 0) {
return;
}
$.post('script.php', postData, function (data) {※2
// 書き込み後処理
});
}
post();
return false;
});

あーでもエラー処理のこと考えると Deffered 使うほうがいいね。

604:596
13/03/02 21:52:27.31
あっと

> postData[$(this).prop('name')] = res.file; // ※1 アップしたファイル名を返す

ここでの this は each() で回している時の thisとは違うから気をつけて。
一旦変数に入れておかないとダメだと思う。

605:Name_Not_Found
13/03/02 22:05:44.56
ajaxで通信する以上、結果が返ってくるタイミングも非同期だから
Defferedで結果が出揃うのを待つのはいい手段だと思う。

606:594
13/03/02 22:38:32.72
>>601>>605
ありがとうございます。Deferredは難しくてよく解らなかったのですが、色々調べながらチャレンジしてみました。

$("form").submit(function() {
var postData = {};
var FileUpLoad;
$(this).find('input').each(function() {
~略~
} else if ($(this).prop('type') == 'file') {
FileUpLoad = $(this).upload('upload.php', function(res) {
postData[$(this).prop('name')] = res.file;
alert('アップロード完了'); // ※1
}, 'json');
~略~
});
$.when(FileUpLoad).pipe(function(){
return $.post('script.php', postData);
}).done(function(){
alert('POST送信完了'); // ※2
});
return false;
});

どうもうまくいきません・・・。
理想としては※1→※2の順にしたいのですが、上記では※2→※1となってしまいます。

>>603-604
コード参考にさせていただきます。
> ここでの this は each() で回している時の thisとは違うから気をつけて。
ご指摘ありがとうございます。実用時に修正します。

607:Name_Not_Found
13/03/03 02:03:13.08
【環境】IE10
【何をしたのか】メニューがマウスオーバーで動くタブを作りましたが
アクティブなタブが選択されている時にそのタブのみアニメーションを止めることが出来ません。
URLリンク(www.dotup.org)
説明が下手なので、スクショです(影が変なのはCSSスレで聞きます…)
試しに「not」を使って.select以外は動かすという記述をしてみたのですが
元々html上でメニュー1に.selectを入れているため
別なタブがアクティブでもメニュー1だけ動かないということになってしまいました。
どなたか解決策をお教えください。よろしくお願いいたします。

608:607続き
13/03/03 02:04:31.05
【サンプルコード】(いじる前のを載せておきます)
$(function() {
$("#tab li").click(function() {
var num = $("#tab li").index(this);
$(".content_wrap").addClass('disnon');
$(".content_wrap").eq(num).removeClass('disnon');
$("#tab li").removeClass('select');
$(this).addClass('select')
});
});
$(function() {
$("#tab li")
.hover(
function(){
$(this).stop().animate({
'marginLeft':'-10px',
'paddingRight':'50px'
},'fast');
},
function () {
$(this).stop().animate({
'marginLeft':'0px',
'paddingRight':'40px'
},'fast');
});
});

609:Name_Not_Found
13/03/03 05:27:45.43
>>606
(Deferredの部分)
それループで type=fileがあらわれるごとにFileUpLoad に上書きしてるじゃない。
(だから、type=fileがひとつの時はうまく行ってないか?)

Deferred objectをまとめるのは $.when() なんだけど、こんなかんじではどうか?

var FileUpLoad; = $.Deferred().resolve(); // ダミーのDeferred objectを作って完了させておく
~略~
 FileUpLoad = $.when(FileUpLoad, $(this).upload(略));

他にも方法有りそうだけど。

610:Name_Not_Found
13/03/03 06:34:12.44 RLVPdppi
 

611:Name_Not_Found
13/03/03 18:42:49.87 RLVPdppi
 

612:Name_Not_Found
13/03/03 20:11:01.24
>>609
おおおお!出来ました!
ありがとうございます!

原理的に何故出来たのかはあまりよく解ってないのですが、とにかく出来て良かったです。
お世話になりました。

613:609
13/03/04 01:47:03.05
>>609
わかってないのかよ。
A = $.when(B, C, ...);
は B,C,… すべてが完了したら、Aに登録したcallback関数が呼ばれる。
だから、$.update()の返り値を全部引数に並べればOKなんだけど、
そうは出来ないのであーいうコードになった。

蛇足ながら、元のコードは
var a;
a = $.update();
a = $.update();
a = $.update();
a.完了したら();

と同じだから、最後の$.updat()の完了状態しか見てないってことな。

614:Name_Not_Found
13/03/04 06:16:27.90 oGj8lgq4
 

615:Name_Not_Found
13/03/04 19:05:28.43 r1nduPu3
 

616:Name_Not_Found
13/03/05 06:07:08.21 /aPGqsrq
 


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch