2009-05-03 87 views
0

在我的基于论坛的网站上,每篇文章下方都有一个链接,用于举报垃圾邮件或滥用行为。点击该链接时,服务器会调用Web服务,当调用返回时,包含该链接的跨度(请参见下面的代码)将更新为“Post reported”(邮政报告)之类的内容,或者如果发生错误,则会显示“发生错误同时报告后”,这是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,举行对包含报告链接的跨度的引用,这意味着如果用户在呼叫之前报告另一个帖子(即点击另一个报告链接)瓮,最后一篇文章的跨度将更新两次,前一篇将不会更新,有没有解决方法?

非常感谢

回答

3

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

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" } 
    ); 
    } 
}

编辑:

嗯..只是想知道,将更新span是指在调用匿名方法相同的跨度? - Waleed Eissa
是的,这是关闭的魔力。试试这个小例子:
<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值。

+0

+1这似乎是一个好主意,我要试试这个..谢谢 – 2009-05-03 08:44:55

+0

嗯..只是想知道,updateSpan是指匿名方法调用时的相同跨度? – 2009-05-03 08:54:50

0

不是JavaScript开发人员,所以这可能无法正常工作。是否可以持有对帖子ID和spanToUpdate的引用,然后让服务器的响应中包含帖子ID。然后你可以检索正确的spanToUpdate。