2011-02-01 5 views
1

最初にASP.NETページをロードしてから、サーバーサイドのイベントを発生させて、クライアントのHTMLを更新したいとします。このイベントは、Anthem.NETのimagebuttonコントロールに関連付けられているため、論理的なアクションは、そのコントロールのイベントを発生させることだけです。しかし、このサーバー側のイベントを発生させ、その結果のhtmlのusercontrolをクライアントに返す別の方法がある場合は、それも考慮します。私はASP.NET 3.5、Anthem.NETフレームワーク、およびJQuery 1.4.4を使用しています。ASP.NETでページが読み込まれたときにAnthem.NETボタンのクリックイベントを発生させるにはどうすればよいですか?

私はこれを数時間にわたって作業していますが、回答を得ているようないくつかの投稿を見てきましたが、そのトリックをやっていないようでした。

ボタン私は火にしようとしています:

<span id="Anthem_ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates__"> 
    <input type="image" 
     name="ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates" 
     id="ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates" 
     src="BVModules/Themes/Depot/images/buttons/GetRates.gif" 
     onclick="javascript:Anthem_FireCallBackEvent(this,event,'ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates','',true,'','','Retrieving rates...',true,null,initAccordion,null,true,true);return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" 
     style="border-width:0px;" /> 
</span> 

アプローチ1:

jQuery(document).ready(function() { 
    setTimeout(getRates, 5000); 
}); 

function getRates() { 
    jQuery('#ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates').click(); 
} 

これを使用して、クライアントに描画されたときに、このようになります

<anthem:ImageButton runat="server" ID="btnGetRates" 
    ImageUrl="~/BVModules/Themes/BVC5/Images/Buttons/GetRates.png" 
    TextDuringCallBack="Retrieving rates..."> 
</anthem:ImageButton> 

メソッドは、ボタンテキストを "レートを取得..."に更新しますが、th eコールは決してサーバーに送信されず、(IE7では)無期限にハングアップします。 Firefoxでは、ボタンが数秒間変化してから元の状態に戻り、サーバーへの呼び出しも開始されません。

興味深いことに、getRates()関数が(document).ready()ではなくボタンクリックイベントから呼び出された場合、IEでは機能しますがFirefoxでは機能しません。

アプローチ2:

私はCall ASP.NET function from JavaScript?で受け入れ答えの指示に従ったが、火災に私のサーバー側のメソッドを引き起こしていないことに加えて、このアプローチは、私は出力をしたいという事実に対処していませんでしたメソッドが完了したときにクライアントに表示されるユーザーコントロールのhtml。

アプローチ3:

jQuery(document).ready(function() { 
    setTimeout(getRates, 5000); 
}); 

function getRates() { 
    var btn = document.getElementById('ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates'); 
    fireEvent(btn,'click'); 
} 

function fireEvent(element,event){ 
    if (document.createEventObject){ 
    var evt = document.createEventObject(); 
    return element.fireEvent('on'+event,evt) 
    } else { 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent(event, true, true); // event type,bubbling,cancelable 
    return !element.dispatchEvent(evt); 
    } 
} 

私はイベントhereを焼成するこの方法を発見しました。

jQueryのアプローチを使用するのではなく、これはjavascriptの基本に戻ります。この方法はIEではうまく機能しますが、もう一度Firefoxに問題があります。これは1つのブラウザで動作しているので、私は近づいているはずです。

興味深いことに、これはIEで完全に動作するように動作していたにもかかわらず、Firefoxの動作はApproach#1の場合とまったく同じです。ボタンが瞬時に「レートの取得」というテキストに変わります。 .. "と非常に速く戻ってそれはちょっとだけ目立つ。

もう一つの手がかり:

私は何が起こっているかのように手掛かりを見つけることができるかどうかを確認するためにAnthem.NETのjavascriptのに掘りました。私は手がかりを見つけましたが、ブラウザの振る舞いの違いを引き起こす理由、または具体的にはこの異なる動作を処理するコードがどのようなものかを正確にはわかりません。次のコードでわかるように、ボタンイベントは他のブラウザとは違ってIEのために付けられています。そしてあなたが疑問に思っている場合には、私はバリデーションコントロール(バリデータ)を使用しています。

// Primarily used by Anthem.Manager to add an onsubmit event handler 
// when validators are added to a page during a callback. 
function Anthem_AddEvent(control, eventType, functionPrefix) { 
    var ev; 
    eval("ev = control." + eventType + ";"); 
    if (typeof(ev) == "function") { 
     ev = ev.toString(); 
     ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}")); 
    } 
    else { 
     ev = ""; 
    } 
    var func; 
    if (navigator.appName.toLowerCase().indexOf('explorer') > -1) { 
     func = new Function(functionPrefix + " " + ev); 
    } 
    else { 
     func = new Function("event", functionPrefix + " " + ev); 
    } 
    eval("control." + eventType + " = func;"); 
} 

私はタオルで投げると私のユーザーコントロールの出力のhtmlを取得するには、Webサービスを使用するアプローチに取り組んでおり、それは、クライアント上で交換することができるようにjQueryに戻す開始する準備はほぼ完了しています私はIE以外のブラウザーでアプローチ#3をどうやって動かすかという手がかりを誰かに教えてもらえるかどうかチェックすることにしました。

答えて

0

あなたはすでに必要な答えを提供しました。レンダリングされたコントロールのonclickイベントにあります。

onclick="javascript:Anthem_FireCallBackEvent(this,event,'ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates','',true,'','','Retrieving rates...',true,null,initAccordion,null,true,true); 

好きな場所あなたはAnthem_FireCallBackEventへの呼び出しを置くことができますが、このようなビットそれを強化する必要があります。

Anthem_FireCallBackEvent(document.getElementById('<%= btnGetRates.ClientID %>'),event,'<%= btnGetRates.UniqueId%>','',true,'','','Retrieving rates...',true,null,initAccordion,null,true,true); 

パスそれあなたが望む任意のイベントを、しかしイベントはできませんnullであればエラーになります。

+0

これを投稿して以来、しばらくしていましたが、私はすでにユーザーコントロールのHTMLを提供するためにWebサービスを構築しました。私が思い出すように、このようなアプローチを使用する際の主な問題は、ボタンを変更したときに、このクライアントサイドスクリプトによって自動的に選択されないことです。しかし、あなたが答えていることを答えとしてマークし、次回に解決策を試してみます。 – NightOwl888

0

私は同様の経験を持っていました。私はjQueryタイマーの代わりにアンセムタイマーを使ってこれを行いました。

+1

ここに例を挙げると、これはもっと便利になります... – endyourif

関連する問題