2009-09-10 16 views
8

私はインラインjQuery UI datepickerを組み合わせたページを作成しました。ユーザーが新しい日付をクリックしてデータを更新したときに、updatepanelへのコールバックを開始するのはやめてください。さて、このページには複数の更新パネルがあります(質問しないでください:))ので、いくつかのものをクライアント側で実行するために、どの更新パネルが更新されたかを確認する必要があります。私は__doPostBackを使ってポストバックを行い、更新が完了したときにはSys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {}を聞きます。ASP.NETアップデートパネルとjQuery UIを組み合わせた奇妙なバグDatePicker

問題は、FFではコールバックが非同期操作ではなく、更新プログラムがどの更新パネルをnullに設定したかを確認するために必要なデータであるということです。

私の問題は、これはIEではうまく動作しますが、他のブラウザではうまくいかないことです.2つのことが原因です:IEは、問題を解決するquirksmodeに入ります。他のブラウザでは使用できないアップデートパネルのネイティブサポートFFやChrome結果でそれをロードしている間、それが想定される内容を示してメッセージボックスになりますIEでこのtestpageを焼成

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js "></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js "></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" /> 

    <script type="text/javascript"> 
     function doAspNetPostback() { 
      __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', ''); 
     } 

     $(document).ready(function() { 
      /* Create the datepicker */ 
      buildDatepicker(); 
      /* Add callback-method for when the scriptmanager finished a request */ 
      Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) { 
       /* Show the panelID - This is 'upd1|hiddenOnSelectionChangedButton' in IE as it should be, and null in Chrome/FF */ 
       alert(sender._postBackSettings.panelID); 
      }); 
     }); 

     function buildDatepicker() { 
      var dp = $("#datepicker").datepicker({ 
       onSelect: function(dateText, inst) { 
        /* Do a postback when someone clicks a date */ 
        doAspNetPostback(); 
       } 
      }); 
     }   
    </script> 

    <div id="datepicker"> 
    </div> 
    <asp:UpdatePanel UpdateMode="Conditional" ID="upd1" runat="server"> 
     <ContentTemplate> 
      <asp:Button ID="hiddenOnSelectionChangedButton" Text="Press me" runat="server" /> 
      <div id="lala" runat="server"> 
       Upd1 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    </form> 
</body> 
</html> 

:私がダウンして、問題を狭め、そしてtestpageを生産してきました

"null"と書かれたメッセージボックスにあります。

私はあらゆることを試しましたが、jQueryやASPの内部動作に深く関わっているわけではないので.NET Ajax。しかし、FireBugのコードをステップバイステップで実行すると、jQueryコールバックとASP.NET Ajaxコールバックの相互運用性に問題があると思います。

ご意見やご提案は高く評価されます。

ありがとうございました。

[更新] Tim解決済み!どうもありがとう! - AJAXとjQueryの組み合わせで:)

答えて

4

は、私はあなたが面白いMSDNからこの記事を見つけ、私の思う:http://msdn.microsoft.com/en-us/magazine/cc163413.aspx

記事はまた、 "(Sys.WebForms.PageRequestManager.getInstance()をadd_pageLoaded" と言って、完全なイベントをUpdatePanelのためにアタッチします。

また 非同期コールバックが UpdatePanelコントロール 完了を代表とCに開始するたびに発射その中にある UpdatePanelが更新されました。

、あなたのハンドラで、あなたは

var panels = args.get_panelsUpdated(); 
for (i=0; i < panels.length; i++) { alert(panels[i]); } 

とupdatedpanelsをループは、私があるため、「_」のプライバシーを意味する_ postBackSettingsを使用してから離れてそれるだろうことができ、ASPの将来のバージョンで廃止することができます.net ajax。

+0

これは動作します。シンプルで素晴らしい:)おかげでたくさん! – cwap

0

共通の問題をこれを理解しようとしている自分の時間を費やしたすべての人にも感謝はこの...

$(document).ready(function() { 
     buildDatepicker(); 

のみ最初のページの負荷に起こるということです。 buildDatapicker()によって影響を受けたHTMLの領域を置き換えた場合。それに付随するすべてのイベントが失われました(たとえ同じ要素で置き換えられたとしても)。

あなたがやらなければならないことは、今新たにロードされたHTMLに対してbuildDatepickerを呼び出し...そしてちょうどあなたがダブルアップしていないことを確認するためにロードされている要素を渡し...

$(document).ready(function() { 
     buildDatepicker(document); 
... 

function buildDatepicker(element) { 
    var dp = $("#datepicker", element).datepicker({ 
     onSelect: function(dateText, inst) { 
      /* Do a postback when someone clicks a date */ 
      doAspNetPostback(); 
     } 
    }); 
}  

ですbuildDatepicker(myNewlyLoadedElement)を呼び出すことができます。データピッカー機能を再バインドします。

+0

まあ、datepickerは既にupdatepanelのコンテンツスコープの外にあるので、影響を受けてはいけません。私はあなたの解決策を試しましたが、それはまだFirefoxでnullを示しています:( – cwap

0

datePickerを使用してaltFieldを設定し、ポストバックを行うための変更をチェックすることができます。

+0

はい、それは唯一の方法ですね:( – cwap

0

エラーを再現するためにコードを試しましたが、エラーを再現できます。そして、私は、jQuery/UpdatePanelsにいくつかの問題があるという結論に達しました。

ボタンをLinkBut​​tonに置き換えると、そのリンクが呼び出しているのとまったく同じ引数を持つ同じ関数である__doPostBack(...)を直接呼び出していることがわかります。そして、リンクボタンを直接クリックすると動作しますが、日付をクリックしても動作しません。

これは、jQuery内部で何らかのコンテキストが変化することを意味しています。しかし、私はそれがどうなるか分かりません。

0

私はしばらくの間使用してきたことがあり、何の問題も一度もない別のスクリプトを見つけました。

<script type="text/javascript"> 
     /* 
     [__doPostBackAsync] 
     Will send an async postback to the backend 
     */ 
     function __doPostBackAsync(eventName, eventArgs) { 
      var prm = Sys.WebForms.PageRequestManager.getInstance(); 

      //check first if the request queues have this item 
      if (!Array.contains(prm._asyncPostBackControlIDs, eventName)) { 
       prm._asyncPostBackControlIDs.push(eventName); 
      } 
      if (!Array.contains(prm._asyncPostBackControlClientIDs, eventName)) { 
       prm._asyncPostBackControlClientIDs.push(eventName); 
      } 
      __doPostBack(eventName, eventArgs); 
     } 
    </script> 

上記のスクリプトとまったく同じように、手動でコールバック関数を手動で設定できます。

scriptresourceハンドラを手動で追加する必要があります(どちらが覚えていないか)が、非同期非同期ポストバックを呼び出す際に問題が発生していることが特に覚えています。希望が役立ちます。

+0

動作しません。私はそれが暗闇で撮影されたレースの条件のように:) – cwap

1

ScriptManagerのScriptMode = "Release"引数を使用して、jQuery/UpdatePanelsでさまざまな非同期の問題を修正しました。

<asp:ScriptManager ID="scriptManager" runat="server" ScriptMode="Release"> 
    </asp:ScriptManager> 
+0

は、悲しげ:( – cwap

0

は、競合状態のように見える、は、UpdateMode = "条件" とChildrenAsTriggers = "false" を、referenceを試してみてください。しかし

+0

didntの助けを動作しませんでしたけれどもしようとしてくれてありがとうしかし、実際に私が探している解決策の種類ではありませんxD – cwap

+0

それが見えます同意しませんけれども:( – slf

0

、私はそれが

ああを働く十分に遅い 放火犯にコードをステップか?なぜそれを解決するためにそれを与えることはありません?

setTimeout(function(){alert(sender._postBackSettings.panelID);},1000); 
+0

ヘヘ...うん、それを試してみました:) – cwap

0

私は、pageLoadedイベントでargs.get_PanelsUpdated()を使用しなければならないという考えを取り入れてTimの答えが気に入っています。あなたがしようとしていることをするための適切な手段のようです。それを試してください - それが動作しない場合、私は私の袖の上にもう一つのアイデアを持っている(その種類の汚れている)。

0

私はdoPostBackの後に警告を追加すると、FFがnullを返さない場合、これは興味深いと思いました。

function doAspNetPostback() { 

     __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', ''); 
     alert('<%= hiddenOnSelectionChangedButton.ClientID %>'); 
    } 
関連する問題