私は,標準的な拡張ポイントを提供するJavaScriptのウィジェットを持っています。そのうちの一つがbeforecreate
関数です。アイテムが作成されないようにするには,false
を返さなければなりません.
jQueryを使ってこの関数にAjaxコールを追加しました。
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
しかし、私のウィジェットがアイテムを作成しないようにしたいので、コールバックではなく、母関数でfalse
を返す必要があります。jQuery やその他のブラウザ内 API を使用して、同期 AJAX リクエストを実行する方法はありますか?
jQueryドキュメント]1より:同期Ajaxリクエストを得るためには、asynchronousオプションをfalseに指定します。そうすると、コールバックはマザー関数が進む前にいくつかのデータを設定することができます。
提案されたように変更すると、コードは次のようになります。
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
を呼び出すことで、jQueryのAjax設定を同期モードにすることができます。
jQuery.ajaxSetup({async:false});
そして、jQuery.get( ... );
を使ってAjaxコールを実行します。
そして、一度オンにするだけで
jQuery.ajaxSetup({async:true});
これは @Adam さんが提案したものと同じだと思いますが、jQuery.get()
や jQuery.post()
をより精巧な jQuery.ajax()
構文に再構成したい人には役立つかもしれません。
素晴らしいソリューションですね。実装しようとしたときに気づいたのですが、success節で値を返しても、未定義として戻ってきてしまいます。そこで、値を変数に格納し、その変数を返す必要がありました。これが私の考えた方法です。
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}