• 締切済み

prototype.jsのAjax.Requestでeventを引数にしたのですが

prototype.jsのAjax.Requestといつ便利な関数がありますが onComplete時の引数にeventオブジェクトを設定したらIE7では eventオブジェクトが引き継げませんでした。 たとえばこのようなメソッドで function ajax_request(url, params, method, ele1, ele2){ var nt = new Date(); var pr = params + "&nt=" + nt.getTime(); var a = new Ajax.Request( url, { method: "get", parameters: pr, onComplete: function(request){ method(request, ele1, ele2); } } ) }; ele1にeventオブジェクトを設定し、methodを実行しても デバックで、ele1.typeが何も表示されませんでした。 firefox2.0だと「click」など正しく表示もされオブジェクトが引き継がれておりました。 何が問題なのでしょうか?それともIE7ではeventオブジェクトを引き継ぐことは出来ないのでしょうか?

みんなの回答

  • Yohjira
  • ベストアンサー率66% (14/21)
回答No.1

試せる環境ではないので推測ですが、 非同期なのでeventオブジェクトが消えているのではないでしょうか。 (methodが呼ばれる前にajax_requestの処理が終了しているので) 同期をとる(asynchronousを指定)ようにしてみたら動いたりしないでしょうか。 (でもFirefoxだと動いているんですよね・・・)

lewlondon
質問者

お礼

回答、ありがとうございます。 Ajax.Requestを同期処理(optionでasynchronous:"false")にしたのですが結果変わらずでした。 エレメントの必要なmethodだけを変数に代入しておく方法で対応できそうです、ありがとうございます。

関連するQ&A

  • prototype.jsのAjax.Request

    javascript部分 function loadDataFile(intvalue){  new Ajax.Request("uploader.php",{   method:'post',   onComplete:function(httpObj){    test(intvalue);   }  }); } function test(intvalue){  // 画像表示のための処理 } htmlのform部分 <form action="sample.php" method="post" name="syouhintouroku" enctype="multipart/form-data">  <input type="file" id="img_path1" name="img1" value="" />  <input type="button" value="画像を確認" onclick="loadDataFile(引数);" /> </form> 今は、ざっとこのような感じで書いています。 「画像を確認」ボタンが押されると画像がアップロードされるようにしたいのですが画像が送られていません。 ちなみに、uploader.phpというのはPOST送信されてきたファイルをサーバー側のファイルに保存する処理をしています。通常のformのsubmitでは画像はちゃんとアップロードされるのでPHPファイルのほうに問題はないと思われます。 もしかして、Ajax.Requestでは画像が送れないとか書き方が違うとかいうことなんでしょうか? よろしくお願いします。

    • ベストアンサー
    • AJAX
  • $.ajax({ って何ですか?

    javascriptとajaxを現在勉強中です。 フリーのソースをダウンロードしたら、 function writeComment(params) { $.ajax({ type: "<?php print METHOD; ?>", url: writescript+params, success: function() { // 受信完了イベント main.php window.mainframe.getLog(); } }); } 「$.ajax({」の使い方が、調べたのですがわかりません。 Ajax.Requestという意味なのは、なんとなくわかるのですが・・。 こういう書き方もあるのでしょうか? どなたかご教授お願い致します。

  • [prototype.js] Ajax.Requestの取得データをコールバック関数外で取得する方法

    下記のコードを実行すると、 'undefined' 'hello' と表示されます。 (A)の箇所でグローバル変数gTestに'hello'が格納されている事を期待するのですが、undefinedとなります。 どういった理由でこうなるのでしょうか? また、onCompleteで定義した処理内で、 値をグローバル変数に格納するにはどのような方法がありますか? 何卒よろしくお願い致します。 -- <script src="/js/prototype.js" type="text/javascript"></script> <script type="text/javascript"> var gTest; function load() { new Ajax.Request('http://~/', { method: 'get', onComplete: displayData }); alert(gTest); //(A)undefinedと表示 } function displayData(httpObj) { gTest = 'hello'; alert(gTest); //(B)helloと表示 } load(); </script> --

  • Ajax.RequestでのPHP通信について

    new Ajax.Request を利用してちょっとしたメール送信フォームを作っています。 一通り完成はしたのですが、PHP側での未入力チェック後、jsでの受け取り方が分からず困っています。 ----- <javascript ソース> function postData() {  new Ajax.Request(   "send.php", {    method: "post",    parameters: Form.serialize("myform"),    onComplete: onCompleteHandler   }  ); } function onCompleteHandler(request) {  // ここでPHP側から未記入チェックを受信したい } <PHP ソース> // 必須項目チェック if( $formValue1 == "" || $formValue2 == "" ) {  // ここから未記入を通知したい } ----- このようにPHP側で記入チェックし、それをjs側で受けとる方法が分からず困っています。 すみませんがどなたか教えていただけると助かります。

  • Ajaxから画像ファイルへのリクエスト

    こんにちは。 現在、prototype.jsを使用してAjaxについて勉強をしています。 【質問】 画像ファイルへAjax.Requestを使用してリクエストを送信した場合、JavaScriptでは受信したバイナリデータを扱う事は出来ないのでしょうか。 【サンプルコード】 new Ajax.Request("hoge.gif", { method: "get", onSuccess:function(httpObj){ var body = httpObj.responseBody; } }); ※ 変数bodyにバイナリデータが入っていると思ってます。 色々調べて周ってみたのですが、画像等のバイナリファイルへリクエストを送信している様な例が無かったので、Ajaxでの通信はテキストデータのやりとりを前提としているのかなと、勝手に予測してみたのですが、どうなんでしょうか。 下記サイトでHttpRequestオブジェクトについて調べてみても、MIMEを取って来れなさそうだったので、やはり扱え無いのかなと思いました。 http://www.devguru.com/Technologies/xmldom/quickref/obj_httpRequest.html あと、余談ですが上記サンプルコードの変数bodyをtypeof()に渡すとunknownになるのですね。。。(IE6) 質問は以上です。 どなたか、暇な時にでもご回答頂ければ幸いです。

  • イベントをつかってコールバックさせたいのですが

    HTAスクリプトでIEを起動し、ページが表示されるのを待つプログラムを 作成しようとしています。 JavaScriptではスリープができないのでisBusyをがfalseになるのを 待つ代わりに、IEオブジェクトのイベントからコールバックさせようと思いました。 そこで次のプログラムを書いたのですが、 イベントハンドラ登録の文法が間違っているらしく、実行時に 「オブジェクトでサポートされていないメソッドまたはプロパティです」 になってしまいます。 この行でやりたいことは、ieオブジェクトの NavigateComplete2 イベントが発生したときに、onComplete が呼ばれるようにすることです。 イベントハンドラの登録方法、または ieがページを読み終わるのを検知するよい方法がありましたら お教え下さい。よろしくお願いします。 ■sample.hta <html> <script> function perform(){   var ie = new ActiveXObject("InternetExplorer.Application");   ie.visible=true;   ie.navigateComplete2 = onComplete; // ←この行がエラー   ie.navigate("http://www.1101.com"); } function onComplete(a, b){   alert("complete"); } </script> <body> <input type=button onclick="perform();" value="open"> </body> </html>

  • 【javascript文法】 prototype.js Ajax.Request onSuccess:に指定するfancitonの書き方

    以下HTMLは開いた時に'2'がアラート、続いて'hello world'がアラートされるものです。 動作的には期待どおりに動きますが、記述方法に難を感じています。 課題としては、Ajax.RequestのonSuccess:に指定するfancrionをprototypeを使って 宣言したfunctionで且つ、引数を与えたいです。 (Ajax.Requestが返してくる引数も使いたい。) 表現が下手ですみません。 ※行頭は全角スペースです。実際に機能させる為には  半角に修正もしくは行頭スペースは削除して下さい。 <html> <head> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"><!-- function http(){  this.val=1; }; http.prototype.request = function(){  var url="/ruby/hello.cgi"; //実際に検証する為にはwebサーバにこのcgiを置く必要あり  new Ajax.Request(url, {   method:"get",   onSuccess: function(h){r.processRequest(h,1);}   /* ↑http.prototype.requestの中なので、r.ではなくthis.processRequest(h,1)と記述したい*/  }); }; http.prototype.processRequest = function(h,arg){  alert(this.val+arg);  alert(h.responseText); }; var r = new http(); r.request(); //--></script> </head> <body></body> </html> 以下"/ruby/hello.cgi"の例 #!/usr/bin/ruby puts "Content-Type: text/html\n\n" puts "hello world" ※実際に実行する場合はprototype.jsが必要です。 これで、期待通りの結果が得られるのですが、コメントに記載したように、 http.prototype.request = function()の中でonSuccess:に指定する関数が、 this.と記述できず、r.と記述しないと動作しません。 http.prototype.request = function()の中で、 ~~~~~~~~~~~~~~ http.prototype.processRequest = function(h,arg) ~~~~~~~~~~~~~~ を使うのですから、 r.processRequest(h,1)ではなく、 ~ this.processRequest(h,1) ~~~~ と記述したいです。 因みに同じような質問を http://oshiete1.goo.ne.jp/qa4663141.html でしており、この『応用』だとも思うのですが、名案浮かばずです。 このような場合、どう記述するのがベターなのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • AJAX
  • Ajaxのエンコードで

    私はshift_JISで作成したCGIのページがあるのですが、 Ajaxを導入しようとしたときに、Ajaxというか Javascriptでは、utf-8しか認識しないととあるサイトに書いてあったのですが、 そのCGIのページをphpに変更するにはものすごく多大な時間が 必要になってしまうんですが、CGIをutf-8仕様にするのも大変です AjaxでShift_JISに変換するような事はできませんでしょうか? http://javascriptist.net/ref_prototype/ajax.periodicalupdater.html のサイトに乗っている <script type="text/javascript" src="/js/prototype.js"></script> <script type="text/javascript"> var myajax; function execute() { myajax = new Ajax.PeriodicalUpdater( "container", "./member.cgi", { "method": "get", "parameters": "id=$id", frequency: 5, // 5秒ごとに実行 onSuccess: function(request) { // 成功時の処理を記述 // alert('成功しました'); // jsonの値を処理する場合↓↓ // var json; // eval("json="+request.responseText); // ↓IEでもキャッシュを読み込まずに毎回リモート接続を実行するためのコード(パラメータの書き換え) var str = myajax.options.parameters; var hash = str.parseQuery(); hash["ajax_request_id"] = Math.random(); hash = $H(hash); myajax.options.parameters = hash.toQueryString(); }, onComplete: function(request) { // 完了時の処理を記述 // alert('読み込みが完了しました'); // jsonの値を処理する場合↓↓ // var json; // eval("json="+request.responseText); }, onFailure: function(request) { alert('読み込みに失敗しました'); }, onException: function (request) { alert('読み込み中にエラーが発生しました'); } } ); } </script> を使用して自動更新をしようと思っているのですが

  • ロード後にイベントをセットしたい

    初めからタグに埋め込まないで、ロード後にイベントをセットしたいと思い、 データを送信してからonCompleteの関数の中に記述しました。 ちゃんとonCompleteの中に来ていることは確認できたのですが、 idがtestのタグをクリックしても反応がありません。 以下のプログラムのどこがいけないのでしょうか? <script type="text/javascript" src="prototype.js"></script> function post_data() { new Ajax.Request( "test.php", { method: "get", parameters: "test=aa", onComplete: function(httpObj){ var obj = document.getElementById("test"); obj.onClick = sample; } } ); } function sample() { alert("aa"); } window.onload = function() { post_data(); } <a href="" id="test">test</a>

  • Ajax.Requestについて

    いつもお世話になっております。 今回はAJAXについてお聞きしたいです。 現在prototype.jsを使って同期通信をしようとしています。 リクエスト部分のソースは以下のようです。 function AjaxLoad() { new Ajax.Request('abc.cgi',         {         method : 'post',         asynchronous : false,          }         ) response = transport.responseText; hyouzi(response); } abc.cgiというものは処理をして値を返すcgiです。 同期通信したのちにその返された値をhyouzi();で使いたいです。 ここでこのAjaxLoad()を呼び出すとtransportはありませんというようなerrorが出ます。 それ以前にabc.cgiを呼んでいるような感じがしません。 上記のような処理をしたい場合はどのように記述すればよいのでしょうか? ご教授願います。

専門家に質問してみよう