2

我在 webpart 中放置了 facebook like 和 google + 按钮,而 webpart 又位于更新面板中。问题是一旦通过更新面板进行异步回发,fb 和 g+ 按钮就会消失。

我还有一个推特按钮,我之前遇到过类似的问题。在我将 twitter javascript 放在更新面板之外之后,它现在可以工作了:

<asp:updatepanel ID="UpdatePanel1" runat="server">
     <asp:WebPartManager ID="WebPartManager1" runat="server">
     </asp:WebPartManager>
     <script type="text/javascript">              
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequest);                
     </script>
     <asp:webpartzone ID="WebPartZone1" runat="server" PartChromeType="None" >
       <ZoneTemplate>
       .
       .
       .
        <a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet Profile</a><br />
        <div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=181772605219534&amp;xfbml=1"></script><fb:like href="" send="false" layout="button_count" width="50" show_faces="false" font="trebuchet ms"></fb:like>
        <br/>
        <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
        <g:plusone size="medium" count="true"></g:plusone>
         .
         .
         </ZoneTemplate>
     </asp:webpartzone>
     <asp:webpartzone ID="WebPartZone2" runat="server" Width="100%" 
                            PartChromeType="None">
         .
         .
         .
     </asp:webpartzone>
</asp:updatepanel>

<script type="text/javascript">
    function pageLoad() {
        $.getScript("http://platform.twitter.com/widgets.js");
    }
</script>

这在 twitter 推文按钮的部分回发后重新加载了损坏的 javascript,它工作正常。但是,当我替换 javascripts 时,facebook 和 google plus 按钮不会发生同样的情况。我正在使用 ASP.NET 4 和 c#。我怎样才能解决这个问题??

4

3 回答 3

3

innerHTMLUpdatePanel 通过设置属性更新其内容。这意味着 UpdatePanel 元素中的任何 DOM 状态在 UpdatePanel 异步回发后都会丢失。fb、g+ 和 twitter 按钮都在使用 UpdatePanel 的 DOM 状态,div服务器在将innerHTMLdelta 发送到客户端时会删除该状态。

在这里查看我的答案:RegisterClientScriptCode not working after a partial post back

您需要禁用 Web 部件的异步回发,或将脚本放在其他地方。

更新的问题

你试过这个吗?删除<script>元素并使用 jquery 调用它们:

<asp:updatepanel............>
     <asp:WebPartManager ID="WebPartManager1" runat="server" />
     <asp:webpartzone...........>
       .
       .
       .
        <a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet Profile</a><br />
        <div id="fb-root"></div><fb:like href="" send="false" layout="button_count" width="50" show_faces="false" font="trebuchet ms"></fb:like><br/>
        <g:plusone size="medium" count="true"></g:plusone>
     </asp:webpartzone>
</asp:updatepanel>

<script type="text/javascript">
    function pageLoad() {
        $.getScript("http://platform.twitter.com/widgets.js");
        $.getScript("http://connect.facebook.net/en_US/all.js#appId=181772605219534&amp;xfbml=1");
        $.getScript("https://apis.google.com/js/plusone.js");
    }
</script>

如果这不起作用,为什么不把按钮分成一个静态面板呢?这些按钮对 UpdatePanel 没有用处。像这样的东西:

<!-- webpartmanager does NOT need to enclose your webparts. 
     Just declare it. -->
<asp:webpartmanager ... /> 

<!-- asp:updatepanel contains the async webpart. -->
<asp:updatepanel ...> 
    <asp:WebPartZone id="WebPartZone1" runat="server">
      <ZoneTemplate>
        ...
      </ZoneTemplate>
    </asp:WebPartZone>
</asp:updatepanel>

<!-- another webpart holds the buttons, NOT contained by updatepanel. -->
<asp:WebPartZone id="WebPartZone2" runat="server">
  <ZoneTemplate>
    <a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet Profile</a><br />
    <div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=181772605219534&amp;xfbml=1"></script><fb:like href="" send="false" layout="button_count" width="50" show_faces="false" font="trebuchet ms"></fb:like><br/>
    <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
    <g:plusone size="medium" count="true"></g:plusone>
  </ZoneTemplate>
</asp:WebPartZone>
于 2011-07-20T15:18:02.770 回答
0

这似乎是非常不寻常的解决方案,但这适用于 chrome 和 firefox。

当我将 facebook 的 javascript src 链接保留在更新面板中并排除更新面板(jquery 调用)时,它就起作用了。对于 Twitter 和 Google + 按钮,它只需要在更新面板之外由 jquery 调用。当我使用以下组合时它起作用了:

<asp:updatepanel............>
 <asp:WebPartManager ID="WebPartManager1" runat="server">
 </asp:WebPartManager>
 <asp:webpartzone...........>
   .
   .
   .
    <a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet Profile</a><br />
    <div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=181772605219534&amp;xfbml=1"></script><fb:like href="" send="false" layout="button_count" width="50" show_faces="false" font="trebuchet ms"></fb:like>
    <br/>
    <g:plusone size="medium" count="true"></g:plusone>
     .
     .
 </asp:webpartzone>
 <asp:webpartzone ..........>
     .
     .
     .
 </asp:webpartzone>
</asp:updatepanel>
<script type="text/javascript">
  function pageLoad() {
    $.getScript("http://platform.twitter.com/widgets.js");          
    $.getScript("http://connect.facebook.net/en_US/all.js#appId=181772605219534&amp;xfbml=1");
    $.getScript("https://apis.google.com/js/plusone.js");
            }
</script>

注意: google +1 按钮在 Internet Explorer 中仍然无法使用,但所有 3 个按钮在 Chrome 和 Firefox 中都可以正常使用。

于 2011-07-20T16:49:00.293 回答
0

我总是将它们排除在部分回发之外。所有广告、+1 和类似按钮都从更新面板中排除。

于 2011-09-20T00:19:14.220 回答