私が最終的に行う必要があるのは、$.ajax()
呼び出しを実行し、それが実行されたら、新しいウィンドウを開くことです。
現在のフォームを保存する「プレビュー」ボタンをクリックすると、保存されたばかりのデータを含むアイテムのプレビューを表示する新しいウィンドウが開きます。
しかし、現状のまま、window.open
関数は、ポップアップブロッカーによってブロックされます。
これが私のコードの基本的な部分です:
HTML:
<a href="/surveys/185/preview" class="preview" target="_blank">Preview</a>
JavaScript:
$('.preview').live('click', function(event){
save_survey($(this).attr('href'));
event.preventDefault();
});
function save_survey(url) {
$.ajax({
type: "POST",
url: form_url,
dataType: 'json',
data: form_data,
success: function(data) {
window.open(url, '_blank');
}
});
}
私は最近この問題に遭遇し、この回避策を見つけました:
1)window.open
を呼び出す直前に$.ajax
を呼び出し、ウィンドウ参照を保存します。
var newWindow = window.open(...);
2)保存されたウィンドウ参照のコールバックセットlocation
プロパティ:
newWindow.location = url;
多分それもあなたを助けるでしょう。
ポップアップブロッカーは通常、ボタンやリンクのクリックなどの直接的なユーザーアクションによってトリガーされないすべてのポップアップをブロックします。
クリックイベントでajaxリクエストを使用する場合、リクエストはクリックイベントから非同期で発生します。そのため、ajaxリクエストが機能し、リクエストからの応答でイベントを取得するまでに、ポップアップブロッカーを邪魔せずにwindow.openをトリガーします。元のクリックイベントは、それまでに長い間死んでいます。
これは この投稿 によると、AJAX新しいウィンドウを開くための呼び出しが完了します。
私はAjax呼び出しを同期的にすることで私の問題を解決しました。例えば。 (jQueryを使用):
$("form").submit(function(e){
e.preventDefault();
$.ajax({
async: false,
url: ...,
data: ...,
success: function(results){
if(results.valid){
window.open(...);
}
}
});
return false;
});