2009-05-03 1 views
0

私のフォーラムベースのウェブサイトには、迷惑メールや不正行為を報告するためのすべての投稿の下にリンクがあります。このリンクがクリックされるたびに、サーバー上でWebサービスが呼び出され、呼び出しが返ってくると、リンクを含むスパン(下のコードを参照)が '投稿の報告'のように更新されます。正しいスパンを更新するには?

<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> 

そして、これは報告リンクです:あなたが保持するため、私は変数、spanToUpdateを使用し、見ることができるように

<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 ... 

エラーがポスト「を報告しながら、これはjavascriptのコードで発生しましたレポートリンクを含むスパンへの参照。つまり、ユーザーがコールリターンの前に別の投稿を報告した場合(つまり、別のレポートリンクをクリックした場合) urns、最後の投稿のスパンは2回更新され、前のものはまったく更新されませんが、これに対する回避策はありますか?

感謝

答えて

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

編集:

うーん...ただ不思議、匿名メソッドが呼び出されたときに同じスパンを参照するupdateSpanでしょうか? - 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()が呼び出されたときのtime/contextからvalの "独自の"値が保持されることがわかります。

+0

+1これは良いアイデアのようですが、私はこれを試してみるつもりです。ありがとう –

+0

うーん..ちょっと思っていますが、匿名メソッドが呼び出されたときにupdateSpanが同じスパンを参照していますか? –

+0

クロージャを作成する関数の内側でupdateSpanスコープを宣言すると、そのクロージャを作成したときの値を保持します。 – Anonymous

0

JavaScriptデベロッパーではないため、これは機能しない可能性があります。投稿IDとspanToUpdateへの参照を保持し、サーバからの応答に投稿IDを含めることは可能でしょうか。次に、正しいspanToUpdateを取得できます。

+0

私はこれが可能だと信じていますが、JS(可能な場合)最後の手段としてこれを残すでしょう... –

関連する問題