Ajaxリクエストで記述されたコードの量を減らす方法は? 非同期ファイルのアップロード

Ajaxリクエスト、すべてがシンプルで、誰もがすでにそれらを書くことに慣れていますが、それでも、どのように書くコードの量を減らすことができます。
jquery.async.js

すぐに例:
<form action="/" jasync> <input type="submit" /> </form> 
フォームは非同期に送信されます

 <input type="file" href="/" multiple jasync /> <div type="file" href="/" multiple jasync> </div> <div href="/" jasync dropfile>      </div> 
ファイルは非同期にロードされます

 <a href="/" jasync data="year=2013&month=5" class="send"> </a> 
データは非同期に送信されます

そして、ここでは、おそらく、受信したデータを処理する方法、フォームが有効でない場合、なぜ送信するのか、追加のパラメーターを送信するのかという質問がありますか?

そして、受信したデータを処理する方法の質問から始めましょう
 $( '.send' ).bind( 'jasync.success', function( e, data ) { // data -   } ); 

まあ、これは面白くないので、多くのコードを削減しません。 しかし、時には便利です。

ここで、 jquery.message.async.jsスクリプトが役立ちます。サーバーから特定の形式でデータを送信するだけです。 そして、jasync = "message"属性
 <form action="/" jasync="message"> <input type="submit" /> </form> 

送信されたデータの例:
 { messages: { { type: 'replace', elem: '#myElem', html: '  ' }, { type: 'append', elem: '.myClass', html: ' ' }, { type: 'delete', elem: '.delElems' }, { callback: 'alert', callback_params: [ '' ] }, { type: 'openPopap', //   jquery.message.ajax.js   ,       html: '...' } } } 

または

 { url: '   ' } 

そのため、ほとんどの場合、ajaxリクエストを作成できません。

さらに、たとえばフォームが無効な場合、送信をキャンセルできます。
 $( 'form' ).bind( 'jasync.beforeSend', function( ) { var form = $( this ); if( !form.isValid() ) { form.jasync( 'stop', true ); //  } //           form.jasync( { 'addData': { count: 20, typesend: 'send jasync' }, 'dataType': 'json' //    } ); } ); 

PHPコードは次のようになります。
 header( 'Content-type: text/json' ); echo json_encode( array( 'messages' => array( array( 'type' => 'replace', 'elem' => '#myElem', 'html' => '  ' ), array( 'type' => 'append', 'elem' => '.myClass', 'html' => ' ' ), array( 'type' => 'delete', 'elem' => '.delElems' ), array( 'callback' => 'alert', 'callback_params' => array('') ) ) ) ); 

それを改善してみましょう、これのために追加のクラスAsyncResponseを書きます
 $message = AsyncResponse::getInstance(); $message ->add( AsyncResponse::REPLACE, '#myElem', '  ' ) ->add( AsyncResponse::APPEND, '.myClass', ' ' ) ->add( AsyncResponse::DELETE, '.delElems' ) ->addCallback( 'console.log', '', '!!!' ); //->openPopup( '' ) $message->end(); 


データがiframe経由で送信される場合は注意してください。これは次の場合に発生します。

  1. 別のドメインにリクエストを送信するとき。
    セキュリティ上の理由から、iframeに読み込まれた別のドメインからデータを読み取ることはできないため、
    あなたが答えるとき、あなたはあなたのドメインにリダイレクトする必要があります、そして、すでに応答を形成します。
  2. FormDataをサポートしていない古いブラウザーで画像をロードする場合
    また、iframe経由で送信する場合、応答にタグ(divなど)がある場合、
    問題がある場合、ブラウザーは余分な終了タグを追加し、jsonの解析は機能しません。
    この場合、タグなしで基本的な回答を送信するか、送受信する前に引用符を置き換えます


ファイルのアップロード



画像
ドラッグアンドドロップの場合、ドラッグアンドドロップをサポートするブラウザでのみ機能します。

クリックすると、選択したファイルのウィンドウが表示されるリンクを作成します
 <a href="/image/save/" name="image" multiple jasync> </a> 

または画像をドラッグする必要がある場所をブロックします
 <div href="/image/save/" name="image" dropfile jasync> </div> 

各画像の読み込みイベントにサブスクライブします

 $( document ).on( 'jasync.beforeSend', 'a[type=file]', function( e, imgs ) { //     $( this ).jasync( { 'addData': { count: 20 }, 'maxSize': 20000 //    } ); if( imgs.nosupport ) { $( '#answer' ).html( '   iframe,    ...' ); return; } for( var i = 0, l = imgs.length; i < l; i++ ) { imgs[ i ] //       .bind( 'jasync.load', function( e, file ) { // file -    base64 $( 'body' ).append( '<img src="' + file + '" />' ); $( this ) //      .bind( 'jasync.uploadProgress', function( e, percent, obj ) { // percent -   } ) //    .bind( 'jasync.success', function( e, data ) { //console.log( data ); } ) //   .bind( 'jasync.error', function() { } ); } ); } } ).on( 'jasync.success', 'a[type=file]', function( e, data ) { //      iframe $( '#answer' ).html( data ); } ); 


スクリプトはhttp://jquery-async.com/download/からダウンロードできます。
または、サーバーが利用できない場合は、かなり可能です。

Source: https://habr.com/ru/post/J177069/


All Articles