API Docs for: 1.0.0
Show:

File: nablarch-widget-event-send_request\ui_public\js\nablarch\ui\event\AjaxAction.js

define(['jquery', './Listener', 'sugar'],
function($, Listener) { "use strict";
  /**
   * Ajaxリクエスト送信アクション
   * =============================================
   * Ajaxリクエストを送信するイベントアクション。
   *
   * Nablarch本体の機構(ウィンドウスコープ/Nablarch サブミット等)
   * と連動し、<n:button>、<n:subimitLink> を使用した場合と同じPOSTリクエストを
   * 送信することができる。
   * また、<n:param> を用いたリクエストパラメータの付与も可能となっている。
   *
   * @class nablarch.ui.event.AjaxAction
   * @author Iwauo Tajima
   * @since 1.4
   */
  AjaxAction.prototype = {
    /**
     * コンストラクタ。
     * @constructor
     * @param {Object} opts このアクションに設定するプロパティ。
     *   **name:**           サブミット名(必須指定)
     *   **uri:**            送信対象URI(必須指定)
     *   **target:**         レスポンスされたページ内で取得対象とするノードを指定するセレクタ式。
     *   **condition:**      リクエスト送信を実行する際に満たすべき条件を表すセレクタ式。
     *   **paramNameAlias:** リクエストを送信する際に、リクエストパラメータの置換を行うルールを定義する。
     *                       置換ルールの書式は以下のとおり。
     *
     *      【置換対象文字列1】/【置換後文字列1】|【置換対象文字列2】/【置換後文字列2】| ..
     */
    constructor: AjaxAction
    /**
     * サブミット名(必須指定)
     * @property name
     * @type String
     */
  , name: null
    /**
     * 検索対象URI(必須指定)
     * @property uri
     * @type String
     */
  , uri: null
    /**
     * レスポンスされたページ内で取得対象とするノードを指定するセレクタ式。
     */
  , target: null
    /**
     * リクエスト送信を実行する際に満たすべき条件を表すセレクタ式。
     * @property condtion
     * @type String
     */
  , condition: null
    /**
     * リクエストを送信する際に、リクエストパラメータの置換を行うルールを定義する。
     * 置換ルールの書式は以下のとおり。
     *
     *    【置換対象文字列1】/【置換後文字列1】|【置換対象文字列2】/【置換後文字列2】| ..
     *
     * 共通画面への遷移を行う場合に、ウィンドウプレフィックスの置き換えを行う場合など
     * に使用する。
     *
     * @property paramNameAlias
     * @type String
     */
  , paramNameAlias: null
    /**
     * このアクションがリスナからコールバックされた場合に実行する処理。
     * プロパティの設定内容に従って、XHRリクエストを送信する。
     * @method fire
     * @param {nablarch.ui.event.Listener} このアクションを呼び出したリスナ
     * @param {jQuery.Event} リスナが捕捉したイベントオブジェクト
     */
  , fire: AjaxAction_sendRequest
    /**
     * 初期化処理後にリスナからコールバックされた場合に実行する処理。
     * fireコールバックと同等のXHRリクエストを送信する。
     * @method fire
     * @param {nablarch.ui.event.Listener} このアクションを呼び出したリスナ
     * @param {jQuery.Event} リスナが捕捉したイベントオブジェクト
     */
  , init: AjaxAction_sendRequest
  };

  function AjaxAction(opts) {
    this.constructor = AjaxAction;
    Object.merge(this, opts);
    // IE8,9 XHR.open bug if url has double byte.
    this.uri = this.uri.escapeURL();
  }

  function AjaxAction_sendRequest(listener, event) {
    if (this.condition && !listener.$watchTarget.find(this.condition).length) {
      return;
    }
    var target      = this.target
      , $form       = listener.$context.closest('form')
      , $submitName = $form
                     .find('input[name="nablarch_submit"]')
                     .val(this.name) //サブミット名を設定する(nablarch本体との連動に必要)
      , queryString = $form.serialize()
      , nameAlias   = this.paramNameAlias;

    if (nameAlias) {
      nameAlias.split('|').each(function(replace) {
        var pattern = replace.split('/');
        queryString = queryString.replace(/(^|&)([^=]+)=(.*?)(?=(&|$))/g,
          function(org, head, name, value) {
            var replaced = name.replace(pattern[0], pattern[1]);
            if (replaced === name) {
              return org;
            }
            return [
              head, name,     '=', value
            , '&',  replaced, '=', value
            ].join('');
          }
        );
      });
    }

    $.ajax({
      type     : 'POST'
    , url      : this.uri
    , dataType : 'html'
    , data     : queryString
    , complete : function(xhr) {
        var html      = xhr.responseText
          , eventName = (xhr.status <= 400)
                      ? 'ajaxSuccess'
                      : 'ajaxError';
        listener.$context.trigger(eventName, [$(html).find(target)][0]);
      }
    });
  }
  Listener.register('Ajax', AjaxAction);
  return AjaxAction;
});