jQueryの戻り値がうまくいかない・・・

このQ&Aのポイント
  • jQueryでXMLを読み込んでパースした値を戻り値として返す関数を作成していますが、うまく動作しません。
  • getValueXML関数を実行すると戻り値には初期値が返ってきます。
  • parse_suc関数内ではXMLのパースがうまくいっているようですが、parse_suc関数を出るとvalueにはその値が引き継がれません。
回答を見る
  • ベストアンサー

jQueryの戻り値がうまくいかない・・・

jQueryでXMLを読み込んでパースした値を戻り値として返す関数を作っているのですが、なぜか動作しません。 すみませんがどこがいけないのか教えていただけないでしょうか? -- JS ---------------------- function getValueXML(){   var value = "初期値";   jQuery.ajax({     url: "/text.xml",     type: 'get',     dataType: 'xml',     timeout: 1000,     success: parse_suc,     error: parse_err   });   function parse_suc(xml){    value = $(xml).find("hoge").text();   }   function parse_err(){    alert("XMLの取得に失敗しました");   }   return value; } -- test.xml --------------------- <?xml version="1.0" encoding="UTF-8"?> <root>   <hoge>テスト</hoge> </root> このgetValueXML関数を実行すると戻り値には"初期値"が返ってきます。 試しにparse_suc関数を以下のようにしてみたら"テスト"がアラート表示されました。 つまりparse_suc関数内ではXMLのパースがうまくいっているようなのです。 function parse_suc(xml){   value = $(xml).find("hoge").text();   alert(value); } しかしparse_suc関数を出るとvalueにはその値が引き継がれません。 valueのスコープがjQueryだとどういう風になっているのかよくわからなく、ずっと悩んでいます。 お手数ですがおわかりの方がいましたらご説明頂ければと思います。

  • suffre
  • お礼率76% (2013/2633)

質問者が選んだベストアンサー

  • ベストアンサー
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

jQuery.ajaxでasyncフラグを特にセットしていないので、 jQuery.ajaxはデフォルトの非同期通信動作をします。 なので、コールバック関数parse_sucが呼ばれるのは、 function getValueXMLを抜けた後です。 値引き継ぎとかスコープの問題以前に、 return value;を通過した時点では、まだparse_sucは呼ばれてさえいません。 あと、jQueryを使っていようがJavaScript のスコープは変わりませんよ。 (jQueryはただのライブラリなのでJavaScriptの言語仕様が変わったりはしない。)

suffre
質問者

お礼

こんな夜中にどうもありがとうございます! jQueryはそういう仕様だったのですね・・・。 asyncをfalseにして同期通信にしてみたらうまく戻り値に値が入りました! この辺り、もっと勉強しないとダメですね・・・。 教えてくださって本当にありがとうございました。

関連するQ&A

  • jQueryを利用する場合の、グローバル変数の範囲について。

    jQueryを利用する場合の、グローバル変数の範囲について。 jQueryを利用してファイルからデータを呼び出して、URL上は画面遷移することなく、 件数に応じて内容を表示するサンプルがあります。 そのスクリプトの中で、スクロール位置をグローバル変数に入れて、別の場所でも使いたいと考えているのですが、うまく変数の値を保持できません。どこがマズいのでしょうか? function test(){    $(":checkbox, :radio").click(function(){      var h = $(window);      hoge = h.scrollTop();      window.alert(hoge);    });      window.alert(hoge); } 一つ目のalertだけだと、スクロール位置が正しく表示されるのですが、 二つ目のalertを付けると、hoge is not defined となります。 jQueryを使っているからなのでしょうか、それとも、単にグローバル変数の使い方を間違っているからなのでしょうか。

  • jqueryのgetでJSPを呼び出したい

    jqueryのgetでJSPを呼び出したい 呼び出し元のhtmlファイル $(document).ready(function(){ $("#btn").click(function(){ $.get("aaa.jsp?test=200", function(data){alert("Data Loaded: " + data);}); }); }); 呼び出すjspファイル <%=request.getParameter("test")%> としてテストしたのですが、ボタンを押しても反応がありません。 (通常のテキストファイルだとうまくいきます) jqueryからjspを呼び出すにはなにか設定が必要なのでしようか?

    • ベストアンサー
    • AJAX
  • jqueryのajax()内からグローバル配列に

    jqueryのajax(){success: function()内からグローバル連想配列に値を格納したい。 jqueryのajax()でhtmlファイルを読み込み配列に格納。 その後他の関数で使いたいと考えていますが グローバル連想配列に格納できません。 success: function()内でさらに関数を定義もして見ましたが反応せず。。。 (プルダウンメニューを変更したら実行する関数) 以下ソースになります。 ----------------------------------------------------------- $(function() { objectarray = new Object(); $.ajax({ type: 'GET', url: 'hoge.html', dataType: 'html', success: function(data) { var text = [];   $(data).each(function(i){ text = $(this).text().split("\n"); }); var alldata = $.grep(text, function(e){return e;});//空白やデータなしを削除 for(i=0; i<alldata.length; i++){ objectarray[i] = (alldata[i]); alert("forの中" + objectarray[i]);//取得できた } alert("forの外" + objectarray);//取得できた return objectarray;//あってもなくても変わらない。。。 }, error:function() { alert('問題がありました。htmlデータがありませんでした。'); }             //return objectarray;←有効にするとjsが認識されなくなります。 }); alert("ajaxの外" + objectarray[0]);//何も表示されない、firebugでみるとobjectarrayには値が入っている。 }); ----------------------------------------------------------- 上記はnew Object()でやっておりますがnew Array()でも同じ結果でした。 回避策をご教授いただけましたら幸いです。 どうぞよろしくお願いいたします。

  • 【jQuery】 changeが検出できない

    間違いがあったため、投稿しなおしです。 MySQL + PHP + javascript with jQuery でプログラムを作成しています。 $.ajaxでPHPを呼び出し、以下のようなinputを書き出しました。 <input id="hoge" onchange="alert('hogehoge')" type="hidden" value="foo" / > その後、以下のようにjsで値の変更を行いましたが、changeイベントが検出できません。 $("#hoge").val("hogehoge");//アラートが出ない 変更後、すぐにアラートが出るようなイメージでいたのですが、アラート自体が出ません・・・ inputに直にonchangeを書いているのがマズイのかな、と思い、以下のように変更もしてみましたが、やはりダメでした。 $("#hoge").livequery("change",function(){ alert("hogehoge"); }); $("#hoge").val("hogehoge");//やはりアラートが出ない プログラムから変更されたval()は、イベントとして取得できないのでしょうか。 なぜ取得できないのか、またそもそも出来ないのなら何か方法はないか、ご存じの方お願い致します。

  • jqueryについて質問です。

    jqueryについて質問です。 ----------------------------------------------------------- test.js $(window).load(function() { $("body").load("a.php"); $("#btn").click(function() { alert();///動作しない } }); ----------------------------------------------------------- a.html <input type="button" id="btn" name="btn" value="send"> ----------------------------------------------------------- load先のidのクリックを監視するにはどうしたらいいのでしょうか?

  • jQuery1.7.2でのdisabledの扱い方

    jQueryで質問させてください。 自分は、チェックボックスとテキストエリアを連動させて、 チェックボックスがチェックされると、disabledが設定されていたテキストエリアが入力可能になり、 チェックボックスのチェックが外されるとテキストエリアに入力不可になるようなものを作っていました。 jQuery1.4.4では以下のように書いて動いていました。 しかし、1.7.2にするとどちらも動かなくなりました。 1.7.2の場合はどのように記述すると以下と同じような動きになるのでしょうか? 宜しくお願いします。 $(document).ready(function() { $('#hogecheck').click(function(e) { if($('#hoge').attr('disabled') == true) { $('#hoge').attr('disabled', ''); } else { $('#hoge').attr('disabled', 'disabled'); } }) });

  • jQuery 同じ処理を関数にまとめたい

    jQueryでプログラムを書いています。 同じ処理が複数出てきているので一まとめにしてて見やすくしたいのですが・・・・ やり方がわかりません。 たとえば、 $("#id1").on("click",function(){ var num1=1; var num2=2; var a; a=num1 + num2; alert(a); }) $("#id2).on("hover",function(){ var num3=3; var num4=4; var b; b=num3 + num4; alert(b) }) のようにほぼ同じ処理を違うイベントで行う場合です。 関数自体は作れるのですが、、、、 function calc(numa,numb){ alert(numa+numb); } jquery内でjavascript(Java?)の関数は使えないというのを聞いたことがあります。 どのようにすれば使ええるのでしょうか?

  • JQueryでfunctionに引数としてIDを渡して処理する方法

    HTMLの制御にjQueryを使用しています。 functionに引数としてIDを渡して処理をしたいのですが、やりかたが分かりません。 テスト的にtest1Script、test2Scriptを作成しました。 test1と同様の結果を、引数にIDを渡すtest2Scriptでも得たいのですが、 失敗(1)や失敗(2)のように書いた場合、うまくいきません。何か良い方法はないでしょうか。ご教授下さい。 <script type="text/javascript"> function test1Script(){ alert($("#textfield1").val()); } function test2Script(objId){ //alert($("#objId").val()); 失敗(1) //alert($(#objId).val()); 失敗(2) } </script> </head> <body> <input type="text" id="textfield1" value="test1" /> <input type="button" id="button1" value="テスト1" onclick="test1Script();" /> <input type="button" id="button2" value="テスト2" onclick="test2Script('textfield1');" /> </body> </html>

  • jQueryで設定したイベントハンドラが消える

    jQueryについての質問です。 ちょっと言葉での説明が難しいので、具体的なコードを記載します。 === JavaScript === var clicked = function () { alert(1); }; var jqButton = $("<input type='button' value='test' />"); jqButton.click(clicked); $(function() { $("#showButton").click(function () { $("#test").html(jqButton); }); $("#hideButton").click(function () { $("#test").html(""); }); }); === HTML === <input type="button" id="showButton" value="show" /> <input type="button" id="hideButton" value="hide" /> <div id="test"></div> showボタンをクリックすると、testボタンが表示されます。 hideボタンをクリックすると、testボタンが消えます。 testボタンをクリックすると、alert(1) が実行されます。 という内容なのですが、一度hideしてから再度showして現れたtestボタンをクリックしても、 何も起きません。 仮に、jqButton.click(clicked); の部分を、 jqButton[0].attachEvent("onclick", clicked); などにすると、再表示させたtestボタンも動作します。 これはjQueryのイベントハンドラ設定APIを使った時特有の症状だと思うのですが、 なぜこのような結果になるのでしょうか。 てっきり、$.click()でイベントハンドラを設定すると、 内部でattachEventとかaddEventListnerとかが走るだけだと想像してましたが・・・ また、attachEventなど使わずに、jQueryの機能を使って、 再表示させてtestボタンも動作させるには、どうしたらいいでしょうか。 ご存知の方いましたら、お願い致します。

  • jQuery 動的にボタンが増えた時

    <html> <head> <title>js sample</title> <script type="text/javascript" src="js/jquery-1.3.2.js"></script> <script type="text/javascript"> jQuery(document).ready( function() { $(".button_cls_1").click(function(){ alert('hello world! button 1'); }); $(".button_cls_2").click(function(){ alert('hello world! button 2'); }); }); </script> </head> <body> <input class="button_cls_1" type="button" value="テスト1" /> <input class="button_cls_2" type="button" value="テスト2" /> </body> </html> 上記のようなスクリプトでbutton_cls_1、button_cls_2が動的に増えた時に どのように書いたらいいかわかりません。 button_cls_1、button_cls_2、button_cls_3、button_cls_4の時もあれば button_cls_1、button_cls_2の時もあります。

専門家に質問してみよう