【问题标题】:How do I detect the id of a currently displayed element using Javascript?如何使用 Javascript 检测当前显示元素的 id?
【发布时间】:2017-08-02 07:48:44
【问题描述】:

我基本上是在使用 Gmail API 为自己创建发送和回复功能。问题出在回复部分。我正在使用 jQuery 为我收件箱中出现的每条消息动态创建 divs (max-count:10) 和一组单独的 divs(点击时出现的任何单个消息一个邮件链接),其中对于每个div,我都有modal-header div 用于主题、回复和关闭按钮,而modal-body div 带有iframe 用于显示内容。

var message1;

function appendMessageRow(message) {
  $('.table-inbox tbody').append(
    '<tr>\
            <td>' + getHeader(message.payload.headers, 'From') + '</td>\
            <td>\
              <a href="#message-modal-' + message.id +
    '" data-toggle="modal" id="message-link-' + message.id + '">' +
    getHeader(message.payload.headers, 'Subject') +
    '</a>\
            </td>\
            <td>' + getHeader(message.payload.headers, 'Date') + '</td>\
          </tr>'
  );

  $('body').append(
    '<div class="modal fade" id="message-modal-' + message.id +
    '" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">\
            <div class="modal-dialog modal-lg">\
              <div class="modal-content">\
				<div class="modal-header">\
                  <h4 class="modal-title" id="myModalLabel">' +
    getHeader(message.payload.headers, 'Subject') +
    '</h4>\
					<button type="button"\
                          class="close"\
                          data-dismiss="modal"\
                          aria-label="Close" style="float:right;">\
					<span aria-hidden="true">&times;</span></button>\
					<span></span>\
					<a data-toggle="modal" href="#reply-modal" id="reply-button" class="btn btn-primary">Reply</a>\
                </div>\
                <div class="modal-body">\
                  <iframe id="message-iframe-' + message.id + '" srcdoc="<p>Loading...</p>">\
                  </iframe>\
                </div>\
              </div>\
            </div>\
          </div>'
  );

  $('#message-link-' + message.id).on('click', function() {
    var ifrm = $('#message-iframe-' + message.id)[0].contentWindow.document;
    $('body', ifrm).html(getBody(message.payload));
    message1 = message;
  });

  $('#reply-button).on('
    click ',function(){
    $("#reply-to").val(getHeader(message1.payload.headers, 'From')); $("#reply-subject").val('RE: ' + getHeader(message1.payload.headers, 'Subject')); $("#message-modal-" + message1.id).fadeOut(); $('div.modal-backdrop.fade.in').fadeOut();
  });
}

我打算使用 回复 按钮调用一个函数,该函数将填充 reply-modal 中的“收件人”和“主题”字段(回复按钮是一个 a 标签带有 href=#reply-modal),在 message-modal-message.iddiv 淡出后可见。问题是我无法获得我需要淡出的这个 div 的 id(连同那个灰色背景)。

此外,如果您可以看到我需要整个 message 对象,而不是单击消息链接的 message.id,以便我可以将“收件人”和“主题”转移到新出现的 reply-modal div。但它只是没有得到点击消息的message.id,而是收件箱页面上显示的邮件列表中的最后一个,因此#message-modal-message.id 不会淡出,因为message.id 不正确。同样,reply-modaldiv 中的“收件人”和“发件人”字段也包含列表中最后一封邮件的信息——无论您打开了哪封邮件。同样由于message-modal-message.id div 没有消失,reply-modal div 出现在它后面,我必须关闭它 div 才能看到reply-modal div。 我什至尝试在外部使用 JS 函数而不是 jQuery 选择器方法$('#reply-modal').on('click',..,但做不到。

基本上, 打开查看消息后如何获取消息对象?

【问题讨论】:

    标签: javascript jquery html gmail-api


    【解决方案1】:

    这正是我所说的。抱歉,如果在尝试理解问题时造成某种混乱,我也无法将整个代码粘贴到问题中。

    “回复”按钮需要为每条消息提供,我们将其作为divs 添加到显示页面,它还使用两个关键变量reply-toreply-subject 来传递打开的新回复表单所需的数据。

    之前无法关闭的“显示消息”div 也与消息 ID 相关联,现在可以访问。

    其他一切都很整洁;发送回复所需的功能与发送新电子邮件相同,并出现在代码的最后。

    我无法做的是在单击“回复”按钮时捕获当前显示消息的消息 ID。这是一个比解决方法“更好”的解决方案,但如果我能做我想做的事情,它会更短!

    <!doctype html>
    <html>
    
    <head>
      <title>Gmail API demo</title>
      <meta charset="UTF-8">
    
      <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
      <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
      <style>
        iframe {
          width: 100%;
          border: 0;
          min-height: 80%;
          height: 600px;
          display: flex;
        }
      </style>
    </head>
    
    <body>
      <div class="container">
        <h1>Gmail API demo</h1>
    
        <button id="authorize-button" class="btn btn-primary hidden">Authorize</button>
    
        <a href="#compose-modal" data-toggle="modal" id="compose-button" class="btn btn-primary pull-right hidden">Compose</a>
    
    
        <table class="table table-striped table-inbox hidden">
          <thead>
            <tr>
              <th>From</th>
              <th>Subject</th>
              <th>Date/Time</th>
            </tr>
          </thead>
          <tbody></tbody>
        </table>
      </div>
    
      <div class="modal fade" id="compose-modal" tabindex="-1" role="dialog">
        <div class="modal-dialog modal-lg">
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
    			  <span aria-hidden="true">&times;</span>
    			</button>
              <h4 class="modal-title">Compose</h4>
            </div>
            <form onsubmit="return sendEmail();">
              <div class="modal-body">
                <div class="form-group">
                  <input type="email" class="form-control" id="compose-to" placeholder="To" required />
                </div>
    
                <div class="form-group">
                  <input type="text" class="form-control" id="compose-subject" placeholder="Subject" required />
                </div>
    
                <div class="form-group">
                  <textarea class="form-control" id="compose-message" placeholder="Message" rows="10" required></textarea>
                </div>
              </div>
              <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="submit" id="send-button" class="btn btn-primary">Send</button>
              </div>
            </form>
          </div>
        </div>
      </div>
    
      <div class="modal fade" id="reply-modal" tabindex="-1" role="dialog">
        <div class="modal-dialog modal-lg">
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
    			  <span aria-hidden="true">&times;</span>
    			</button>
              <h4 class="modal-title">Reply</h4>
            </div>
            <form onsubmit="return sendReply();">
              <div class="modal-body">
                <div class="form-group">
                  <input type="email" class="form-control" id="reply-to" required disabled/>
                </div>
    
                <div class="form-group">
                  <input type="text" class="form-control" id="reply-subject" required />
                </div>
    
                <div class="form-group">
                  <textarea class="form-control" id="reply-message" placeholder="Message" rows="10" required></textarea>
                </div>
              </div>
              <input type="hidden" id="reply-message-id" />
              <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="submit" id="reply-button" class="btn btn-primary">Send</button>
              </div>
            </form>
          </div>
        </div>
      </div>
    
    
      <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
      <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
      <script src="withinViewport.js"></script>
      <script src="jquery.withinviewport.js"></script>
      <script type="text/javascript">
        var clientId = 'YOUR_CLIENT_ID.apps.googleusercontent.com';
        var apiKey = 'YOUR_API_KEY';
        var scopes = 'https://www.googleapis.com/auth/gmail.readonly';
    
        function handleClientLoad() {
          gapi.client.setApiKey(apiKey);
          window.setTimeout(checkAuth, 1);
        }
    
        function checkAuth() {
          gapi.auth.authorize({
            client_id: clientId,
            scope: scopes,
            immediate: true
          }, handleAuthResult);
        }
    
        function handleAuthClick() {
          gapi.auth.authorize({
            client_id: clientId,
            scope: scopes,
            immediate: false
          }, handleAuthResult);
          return false;
        }
    
        function handleAuthResult(authResult) {
          if (authResult && !authResult.error) {
            loadGmailApi();
            $('#compose-button').removeClass("hidden");
            $('#authorize-button').remove();
            $('.table-inbox').removeClass("hidden");
          } else {
            $('#authorize-button').removeClass("hidden");
            $('#authorize-button').on('click', function() {
              handleAuthClick();
            });
          }
        }
    
        function loadGmailApi() {
          gapi.client.load('gmail', 'v1', displayInbox);
        }
    
        function displayInbox() {
          var request = gapi.client.gmail.users.messages.list({
            'userId': 'me',
            'labelIds': 'INBOX',
            'maxResults': 10
          });
          request.execute(function(response) {
            $.each(response.messages, function() {
              var messageRequest = gapi.client.gmail.users.messages.get({
                'userId': 'me',
                'id': this.id
              });
              messageRequest.execute(appendMessageRow);
            });
          });
        }
    
        function appendMessageRow(message) {
          var reply_to = (getHeader(message.payload.headers, 'Reply-to') !== '' ? getHeader(message.payload.headers, 'Reply-to') : getHeader(message.payload.headers, 'From')).replace(/\"/g, '&quot;');
          var reply_subject = 'Re: ' + getHeader(message.payload.headers, 'Subject').replace(/\"/g, '&quot;');
          $('.table-inbox tbody').append(
            '<tr>\
                <td>' + getHeader(message.payload.headers, 'From') + '</td>\
                <td>\
                  <a href="#message-modal-' + message.id +
            '" data-toggle="modal" id="message-link-' + message.id + '">' +
            getHeader(message.payload.headers, 'Subject') +
            '</a>\
                </td>\
                <td>' + getHeader(message.payload.headers, 'Date') + '</td>\
              </tr>'
          );
    
          $('body').append(
            '<div class="modal fade" id="message-modal-' + message.id +
            '" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">\
                <div class="modal-dialog modal-lg">\
                  <div class="modal-content">\
    				<div class="modal-header">\
                      <h4 class="modal-title" id="myModalLabel">' +
            getHeader(message.payload.headers, 'Subject') +
            '</h4>\
    					<button type="button"\
                              class="close"\
                              data-dismiss="modal"\
                              aria-label="Close" style="float:right;">\
    					<span aria-hidden="true">&times;</span></button>\
    					<span></span>\
                    </div>\
                    <div class="modal-body">\
                      <iframe id="message-iframe-' + message.id + '" srcdoc="<p>Loading...</p>">\
                      </iframe>\
    				  <div class="modal-footer">\
    			<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>\
    			<button type="button" class="btn btn-primary reply-button" data-dismiss="modal" data-toggle="modal" data-target="#reply-modal"\
    			onclick="fillInReply(\'' + reply_to + '\',\'' + reply_subject + '\',\'' + getHeader(message.payload.headers, 'Message-ID') + '\');">Reply</button>\
    			</div>	\
                    </div>\
                </div>\
    			</div>\
              </div>'
          );
    
    
          $('#message-link-' + message.id).on('click', function() {
            var ifrm = $('#message-iframe-' + message.id)[0].contentWindow.document;
            $('body', ifrm).html(getBody(message.payload));
          });
        }
    
    
    
        function getHeader(headers, index) {
          var header = '';
          $.each(headers, function() {
            if (this.name === index) {
              header = this.value;
            }
          });
          return header;
        }
    
        function getBody(message) {
          var encodedBody = '';
          if (typeof message.parts === 'undefined') {
            encodedBody = message.body.data;
          } else {
            encodedBody = getHTMLPart(message.parts);
          }
          encodedBody = encodedBody.replace(/-/g, '+').replace(/_/g, '/').replace(/\s/g, '');
          return decodeURIComponent(escape(window.atob(encodedBody)));
        }
    
        function getHTMLPart(arr) {
          for (var x = 0; x <= arr.length; x++) {
            if (typeof arr[x].parts === 'undefined') {
              if (arr[x].mimeType === 'text/html') {
                return arr[x].body.data;
              }
            } else {
              return getHTMLPart(arr[x].parts);
            }
          }
          return '';
        }
    
        function sendEmail() {
          $('#send-button').addClass('disabled');
    
          sendMessage({
              'To': $('#compose-to').val(),
              'Subject': $('#compose-subject').val()
            },
            $('#compose-message').val(),
            composeTidy
          );
          return false;
        }
    
        function sendMessage(headers_obj, message, callback) {
          var email = '';
    
          for (var header in headers_obj)
            email += header += ": " + headers_obj[header] + "\r\n";
    
          email += "\r\n" + message;
    
          var sendRequest = gapi.client.gmail.users.messages.send({
            'userId': 'me',
            'resource': {
              'raw': window.btoa(email).replace(/\+/g, '-').replace(/\//g, '_')
            }
          });
    
          return sendRequest.execute(callback);
        }
    
        function fillInReply(to, subject, message_id) {
          $('#reply-to').val(to);
          $('#reply-subject').val(subject);
          $('#reply-message-id').val(message_id);
        }
    
        function sendReply() {
          $('#reply-button').addClass('disabled');
          sendMessage({
              'To': $('#reply-to').val(),
              'Subject': $('#reply-subject').val(),
              'In-Reply-To': $('#reply-message-id').val()
            },
            $('#reply-message').val(),
            replyTidy
          );
          return false;
        }
    
    
    
        function replyTidy() {
          $('#reply-modal').modal('hide');
          $('#reply-message').val('');
          $('#reply-button').removeClass('disabled');
        }
    
    
        function composeTidy() {
          $('#compose-modal').modal('hide');
    
          $('#compose-to').val('');
          $('#compose-subject').val('');
          $('#compose-message').val('');
    
          $('#send-button').removeClass('disabled');
        }
      </script>
      <script src="https://apis.google.com/js/client.js?onload=handleClientLoad"></script>
    </body>
    
    </html>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2016-02-18
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多