2016-07-09 6 views
0

私は広告サイトを持っています。あなたのアカウントでは、複数の画像をブラウザでプレビューしてからサーバーに送信することができます。保存ボタンをクリックすると、すべてのデータがサーバーに送信されます。次に、新しい画像を削除したり追加したりするには、サイクルごとに(HTMLページを読み込んでいる間はPHPで)ロードし、次に配列に配置して(JavaScript)、画像との関連で変更があったかどうかを確認します - サーバーに送信するか、サーバー上のすべてを削除します。ブラウザでプレビューしてサーバーに画像を読み込んで削除する

問題は、イメージがHTMLページに表示される順序で配列に配置されないことです。正確なコードは、ブートごとに異なる方法で動作します。時にはイメージの順序と同じであることもあります。各イメージの読み込み速度の違いの場合がありますが、ページが完全に読み込まれた後に、イメージを読み込みます。

以下はコードです。

ロード画像:

<?php 
    $imgOut = ''; 
    $i = 0; 
    while(($fileName = $fileNamesArr->fetch_object()) !== null){ //Image names from the database 

    $imgOut .= '<div id="img-'.$i.'" class="image" style="background: url(images/'.$fileName->Filename.'); background-size: cover;">'; 
    $imgOut .= '<a href="#" id="drop-'.$i.'" class="drop-button">Удалить изображение</a>'; 
    $imgOut .= '</div>'; 
    $i++; 
    } 

    echo '<div id="upload-button"><span>Кол-во файлов: <b>'.$i.'</b></span></div>'.$imgOut; 
    ?> 

次に配列にそれをプッシュする:

<script type="text/javascript"><!-- 
    $(window).load(function() { 
     var dataArray = []; 
    var data_Array_old = []; 
      var divImg = $('.image'); 
      var re = /^url\("(.+)"\)$/; 

     $.each(divImg, function(index){ 
      var str = $(this).css('background-image'); 
     //alert(str); 

     var newstr = str.replace(re, "$1"); 
     (function(index){ 
      var img = new Image(); 

     img.setAttribute('crossOrigin', 'anonymous'); 

     img.onload = function() { 
      var canvas = document.createElement("canvas"); 
      canvas.width = this.width; 
      canvas.height = this.height; 

      var ctx = canvas.getContext("2d"); 
       ctx.drawImage(img, 0, 0); 

      var dataURL = canvas.toDataURL("image/jpeg"); 
      dataArray.push({name : newstr.replace(/(.+)\/(\w+)\.(jpg|jpeg)$/,"$2"), value : dataURL}); 
      //alert(dataArray[index].name); 
       if((index + 1) == divImg.length) { 
       Array.prototype.push.apply(data_Array_old, dataArray) 
       } 
     }; 

     img.src = newstr; 
     })(index); 

     }); 
    }); 
--></script> 

私たちは警告のコメントを解除した場合、我々はそのようないくつか得ることができます:ALERT1 - IMG1、IMG2、IMG3をalert2 - error(未定義の 'name'プロパティを読み取れません)、img2、img3。したがって、dataArrayには2つのイメージimg1はプッシュされませんが、次の起動時には正常にプッシュできます。

+1

を使用する必要がある文字列をエスケープするために、

<fieldset/>, <input type="radio,checkbox"> , .... 

とそしてJSでそれを使用することができますが、私は正確にあなたの質問が何であるかを理解していなかった解決策かどうかPHPまたはjavascriptで行う必要があります。 –

+0

PHP **では、新しくアップロードされたイメージの配列と既存のイメージの配列(最初にアップロードされたもの)を得ることができれば、 'array_intersect'と' array_diff'を使って新しいものを見つけることができます。 –

+0

PHPがキャンバスも作成している可能性があるので、等号のコードアライメントはひどく見え、あなたの例は私に納得させません。既にキャンバス要素が作成されているので、既にキャンバス要素が作成されている(またはキャンバス要素が削除されて再作成される)ため、このキャンバス要素が作成されるため、このような操作によるアプローチの結果でもよいでしょう。そのコードはどこですか? – entwicklerseite

答えて

0

フォーム内でフォームを使用し、フォーム内の要素を追加/削除します。... このフォームを投稿し、フォームserversideを処理します。

事前に電話をかけて、サーバーからすべての画像URLを取得することができます。 サーバーは、必要に応じてセッションスコープまたはsthのみでこれらの場所を一時的に格納することができます。

あなたのhtml内のメディアURLとしてチェックボックスを使用します。あなたのhtmlがの状態を既に管理しています。

<form action="yourservice.php" method="post" target="_blank"/> 

は、自動的に素敵なリクエストボディになります。 あなたは、一般的に、私は問題を見

encodeURI() // to escape your strings 
関連する問題