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>

就像我之前说的,当我在页面加载时为我的第一条记录单击“共享”按钮时,这可以正常工作。如果我打开另一个,我的第一个和第二个共享都会打开。

当我调试时,我可以看到mailtoVal从未设置为适当的值。几乎就像它将每个连续的共享存储为一个数组一样,并在单击共享时循环遍历它们中的每一个。

我的直觉告诉我,我需要做一些事情setTimeout或某种异步编码,但我对最好的方法有点模糊。

最好在showDetails()处理共享之外创建另一个函数吗?我推迟了这样做,因为我需要接收 ID 作为参数并再次检索 ID... 的结果。

请注意——这段代码的大部分不是我写的。我在开发周期的后期被分配到这个项目,现在我只是在尝试调试它。

我知道这有点令人困惑,所以如果需要任何其他信息,请告诉我。

4

1 回答 1

2

在绑定另一个单击处理程序之前,您必须禁用以前的单击处理程序:

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

如果没有.off()事件处理程序会不断添加到您的共享链接中,从而导致您遇到的情况。

此外,您可以删除函数$(document).ready(function() { ... }内部showDetails()。那里没有必要;只需确保showDetails()在页面完全加载之前不调用。

于 2013-05-07T16:14:14.990 回答