代码之家  ›  专栏  ›  技术社区  ›  Waleed Eissa

如何更新正确的跨度?

  •  0
  • Waleed Eissa  · 技术社区  · 15 年前

    在我基于论坛的网站上,我在每个帖子下面都有一个链接,用于报告垃圾邮件或滥用信息。每当单击此链接时,将在服务器上调用Web服务,当调用返回时,包含链接的范围(请参见下面的代码)将更新为类似“已报告日志”的内容,或者如果出现错误,则显示类似“报告日志时出错”的内容,这是javascript代码:

    <script src="/js/MicrosoftAjax.js" type="text/javascript" language="javascript"></script>
    
    <script type="text/javascript" language="javascript">
    
        var spanToUpdate;
    
        function ReportPost(updateSpan, postID)
        {
          if (confirm("Are you sure you want to report this post as spam or abuse?"))
          {
            spanToUpdate = updateSpan;
            var proxy = SiteWS.ReportPost(postID, onReportPostSuccess, onReportPostFailure);
          }
        }
    
        function onReportPostSuccess(sender, e)
        {
          spanToUpdate.innerHTML = "Post reported";
        }
    
        function onReportPostFailure(sender, e)
        {
          spanToUpdate.innerHTML = "An error occurred while reporting the post";
        }
    
    </script>
    

    这是报告链接:

    <div class="post">
      <p>post text here</p>
      <span><a href="#" onclick="ReportPost(this.parentNode, <%= post.ID %>);return false;" title="Report spam or abuse">Report Post</a></span>
    </div>
    
    Other posts ...
    

    如您所见,我使用一个变量spantoupdate来保存对包含报告链接的范围的引用,这意味着如果用户在调用返回之前报告另一个日志(即单击另一个报告链接),那么最后一个日志的范围将更新两次,而前一个日志将不会被更新,那么是否存在针对是?

    多谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   VolkerK    15 年前

    您可以使用匿名函数和闭包。

    function ReportPost(updateSpan, postID) {
      if (confirm("Are you sure you want to report this post as spam or abuse?")) {
        var proxy = SiteWS.ReportPost(
          postID,
          function(sender,e) {updateSpan.innerHTML = "Post reported" },
          function(sender,e) {updateSpan.innerHTML = "An error occurred while reporting the post" }
        );
      }
    }

    编辑:

    隐马尔可夫模型。。只是想知道,当调用匿名方法时,updateSpan会引用相同的范围吗?瓦利德·艾莎
    是的,这就是闭包的魔力。试试这个小例子:
    <head>
      <script>
        function foo()
        {
          bar(1, 100);
          bar(2, 150);
          bar(3, 200);
          bar(4, 250);
          bar(5, 300);
          document.getElementById("div1").innerHTML += "foo() is done. ";
          return;
        }
        function bar(val, timeout) {
          window.setTimeout(
            function() {
              document.getElementById("div1").innerHTML += " " + val + " ";
            },
            timeout
          );
        }
      </script>
    </head>
    <body>
      <button onclick="foo()">click</button>
      <div id="div1"></div>
    </body>
    您将看到,每次调用匿名函数时,它都会从调用bar()的时间/上下文中保留“自己的”val值。
        2
  •  0
  •   willcodejavaforfood    15 年前

    不是JavaScript开发人员,因此这可能不起作用。是否可以保存对post id和spantoupdate的引用,然后让服务器的响应包含post id。然后可以检索正确的spantoupdate。