web-dev-qa-db-ja.com

応答に基づいてターゲット_blankをajaxフォームに追加する

私はこれで数日間髪の毛を抜いてきましたが、フォームの送信時にこれほど単純なものを実際に実行することはできません。

私がやろうとしているのはこれです...フォームに入力して検証に合格し、クリックでajax応答が販売された場合、フォームを/ successに移動して、次のような新しいタブ/ウィンドウを開きます。 google.comその他の場合は、失敗したページに移動します

それは私が知っている簡単です。問題は、これをクリックして、新しいウィンドウ/タブが表示されると、ポップアップウィンドウがそれをブロックすることです。これは、このメソッドがボタンをクリックする有効な方法ではないことを示しています。

これは私のフォーム.moduleとして持っているものです

    function storageform($form, &$form_state){

        $form['first_name'] = array(
            '#type'  => 'textfield',
            '#title' => t('First Name'),
            '#required' => TRUE,
        );

        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => t('Submit'),
            '#ajax' => array(
                'callback' => 'storage_form_ajax_callback',
            ),
            '#attached' => array(
                'js' => array(
                drupal_get_path('module', 'storage_form') . '/storage_redirect.js' => array(
                'scope' => 'footer',
            ),
         ),
      ),
    );

        if(isset($form_state['values'])){
            $form['page_output'] = array(
            '#markup' => storagedb_submit($form, $form_state)
            ); 
        }
        return $form;   
    }




    /**
     ** Form Ajax
     **/
function storage_form_ajax_callback($form, $form_state) {

      $receipt_info = 'sold';

$commands = array();
      $commands[] = ajax_command_remove('div.messages');
      $commands[] = ajax_command_before('#main', theme('status_messages'));

    if(!form_get_errors()){
      $commands[] = array(
        // The command will be used in JavaScript file 
        'command' => 'storage_redirect',
        // JavaScript function:
        'itemstatus' => $receipt_info,
    );    

    }
    return array('#type' => 'ajax', '#commands' => $commands);
}

    function storage_form_ajax_callback_validate($form, $form_state){

        if($form_state['values']['first_name'] == ''){
            form_set_error('first_name', t('First name required.'));
        }
    }

storage_redirect.js

    (function($){
    Drupal.ajax.prototype.commands.payday_redirect = function(ajax, response, status){          
                if(response.leadstatus == 'sold'){
document.location.replace("http://localhost/storageform/thanks");
window.open('http://www.google.com','_blank');
                    }else{
document.location.replace("http://localhost/storageform/failed");
                }
        }
    }(jQuery, Drupal));

誰かが私が抱えている問題のこの小さな悪夢を助けてください。ありがとうございました。

3
Suzed

答えは信じられません。ポップアップブロックは、ユーザーがアクションを開始しなかった(リンクをクリックした)ときにブラウザーが新しいウィンドウまたはタブを開かないようにすることを目的としています。新しいウィンドウまたはタブを開く方法はいくつかあります。ただし、ユーザーが実際にクリックしたかどうかをブラウザーにだまして(いいえ、$(a).click()はそれをだますことはありません)、ユーザーがポップアップブロックをオフにしていない限り、常にポップアップが表示されます。それを行うブロッカーは、意図された義務です。

ユーザーに別のウィンドウを開くつもりであることをユーザーに忠告していると思いますが、フォームの送信が成功したときにリンクを提供するだけではどうですか。あるいは、phpBBのログイン画面(「ログインしていただきありがとうございます。5秒後にXXXにリダイレクトされます」と表示される画面)でよく見られるような遅延リダイレクトを実行することもできます。

1
Chris Rockwell

ポップアップブロッカーを回避する方法は、「フォームの検証を待っています」などのコンテンツを含む、ユーザーのクリック時に直接新しいウィンドウを開くことです。通常、ユーザーの直接的な操作により、新しいウィンドウを作成できます。次に、ajaxが完了したら、ウィンドウを適切な場所で更新するか、単に閉じます。

0
Mołot