2

これを説明するのは少し難しいです。何百もの病院と医師のリストを含む検索結果ページがあります。ページの読み込み時に各レコードが JavaScript 配列に読み込まれるため、ページをリロードしなくてもすべてのレコードにアクセスできます。ユーザーは、個々の病院または医師の詳細情報を表示する「詳細」ページをクリックすることもできます。これも動的で、ページのリロードは必要ありません。

ここで私の問題が発生します。

各詳細ページで、ユーザーは病院/医師の情報を共有 (電子メール) することができます。私の問題は、ユーザーが複数の病院/医師のリストを次々に共有しようとすると、mailtoリンクはユーザーが以前に開いたすべての電子メール インスタンスを開くように見えることです。

病院 A で [共有] をクリックすると、病院 A の電子メール ウィンドウが開きます。この共有ウィンドウを閉じてから、病院 C の [共有] をクリックすると、2 つのウィンドウ (病院 A と病院 C) が開きます。あたかも連続するすべての共有の配列が保存されているかのように。紛らわしいです、はい、私は知っています:-)

コードを少し分解してみましょう。詳細ページは関数によって処理されますshowDetails(id)。パラメータは、id詳細が表示されているレコードであり、この詳細ページには [共有] ボタンがあります。関数の概要は次のとおりです (非常に要約されています)。

function showDetails(id) {
  // make visual transitions to details page //

  rec = new Array();

  // get this record (rec)
  for( var i = 0; i < results.length; i++){
    if (results[i]['row_id'] == id){
      rec = results[i];
      break;
    }
  }

  // set record variables
  var longName = rec['longName'];
  var city = rec['city'];
  var state = rec['state'];
  ...

  // output variables into lovely html //

  // handle Share button. I think this is where my issue is
  $(document).ready(function(){

    $("a[rel='email']").each(function(){
      // Modify the mailto: value
      var mailtoVal = $(this).attr('href');
      var body_message = '';
      body_message += longName+"%0D%0A%0D%0A ";
      body_message += address.replace("<br>","%0D%0A") +"%0D%0A ";
      body_message += city+", "+state+" "+zipCode+"%0D%0A ";
      body_message += phoneFormat(phone)+"%0D%0A %0D%0A ";
      body_message += emailAddress+"%0D%0A ";
      body_message += shortURL+"%0D%0A ";

      mailtoVal = 'mailto:name@domain.com?subject=Provider Information&body='+body_message;
      $(this).click(function(){
        window.location.href = mailtoVal;
        return false;
      });
    });
  });
}

そして下に、このコードは私の実際のリンクです:

<a class="button" href="#" rel="email">Share</a>

前に言ったように、ページがロードされたときに最初のレコードの [共有] ボタンをクリックすると、これはうまく機能します。別の共有を開くと、最初と 2 番目の共有の両方が開きます。

mailtoValデバッグすると、適切な値に設定されていないことがわかります。あたかも、連続する各共有を配列としてどこかに保存し、[共有] をクリックすると、それぞれをループしているように見えます。

setTimeout私の直感では、何らかの非同期コーディングを行う必要があることを教えてくれますが、それらを実行するための最善の方法については少し漠然としています。

共有を処理するために外部に別の関数を作成するのが最善でしょうshowDetails()か? ID をパラメーターとして受け取り、ID の結果を取得する必要があるため、これを延期しました... もう一度。

注意してください- このコードの大部分は私が書いたものではありません。私はこのプロジェクトの開発サイクルのかなり遅い時期に割り当てられましたが、今は単にデバッグしようとしています。

これは少しわかりにくいと思いますので、追加情報が必要な場合はお知らせください。

4

1 に答える 1

2

別のクリック ハンドラーをバインドする前に、以前のクリック ハンドラーを無効にする必要があります。

$("a[rel='email']")
    .off('click')
    .each(...)

イベント ハンドラーがない.off()と、Share リンクに追加され続け、問題が発生します。

$(document).ready(function() { ... }さらに、関数内のを削除できshowDetails()ます。そこは必要ありません。showDetails()ページが完全に読み込まれる前に呼び出されないようにしてください。

于 2013-05-07T16:14:14.990 に答える