2

解决

我如何设置要解决的问题?哈哈

无论如何,这是解决方案,我让我的朋友帮助我,他做到了!

首先,正如我所说,我使用的是更新面板,jQuery 没有从中注册部分回发,这是主要问题。没有更新面板就无法工作的一个稍微小一点的问题是单击时函数中的 1 和 0 值被错误地交换了。

因此,首先我们对 OnInit 方法进行了覆盖,但您也可以将相同的代码放入页面加载中(除了对基于 init 代码 ofc 的调用):):

protected override void OnInit(EventArgs e)
    {


        base.OnInit(e);

        prikazi.Attributes.Add("onclick", "return LinkKlik();");


        ScriptManager.RegisterStartupScript(this, this.GetType(), "init", "checkComponent();", true);
    }

我们注册一个脚本以在每次页面重新初始化时运行,即使是异步回发 :) 我们也将点击功能添加到链接按钮。

jquery代码如下:

function checkComponent() {
    //
    if (document.getElementById('hidTracker').value == '1') {
        $(".sokrij").show();

    }
    else {
        $(".sokrij").hide();
    }
}

function LinkKlik() {

    var panel = $("#fioka").find(".sokrij");

    if (panel.is(":visible")) {
        panel.slideUp("500");
        $('#hidTracker').attr("value", "0");

    }
    else {
        panel.slideDown("500");
        $('#hidTracker').attr("value", "1");

    }
    // that's it folks! (return false to stop the browser jumping the the '#' link
    return false;
}

和之前基本一样,只是通过上面的覆盖,分成了2个与事件相关联的函数。

最后一件事,你需要这些:

        <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <script type="text/javascript" src="drawer.js"></script>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
            <asp:HiddenField ID="hidTracker" runat="server" Value="0" />
            <div id="fioka">
                <asp:LinkButton runat="server" href="#" ID="prikazi">Click This to show/close</asp:LinkButton>
                <div class="sokrij" id="sokrij">
                    HIDE THIS!!!
                </div>
            </div>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="prikazi" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>

它甚至可以在更新面板中工作。该按钮用于生成回发,您甚至可以将一个按钮放在外面以在更新面板之外生成真正的回发。状态的值记录在隐藏字段中,链接按钮是我们用来显示/隐藏的按钮。如果有人需要这个,干杯,因为我看到很多关于同一件事的帖子,但没有人回答。

谢谢大家的回答,尤其是蟹桶

如果可以的话,我会给你们所有人+rep,但正如你们所看到的那样,这才刚刚开始。

我有一个控件,其中有各种回发的元素。我在更新面板的主页中拥有该控件,并且效果很好。我想要做的是隐藏一半的元素,并且只有在单击按钮时才能显示它们。我设法找到了一些 jQuery 抽屉,它看起来不错,但是每当我打开面板并更改一个元素时,该元素具有回发以在单击或值更改时调用 ac# 函数时,抽屉就会打开(无论我是否按下打开的抽屉链接)。

我的元素必须有回发!我需要那个抽屉显示/隐藏东西来隐藏其中的一半......

这是我到目前为止在抽屉里的东西,我自己整理了一些代码。正如我用这段代码所说的,我单击任何导致回发的按钮,即使我没有单击打开的抽屉链接,抽屉也会在回发后打开。除此之外,它在回发之间可以正常工作,但我必须让它即使在回发时也能正常工作!

$(function () {

$(".sokrij").hide(),


$("#prikazi").live("click", function (evt) {
        evt.preventDefault();

        $("#fioka").find(".sokrij").each(function () {

            if ($(this).is(":visible")) {
                $(this).slideUp("500");
            }
        });

        if ($(this).next().is(":hidden")) {
            $(this).next().slideDown("500");
        }

        return false;
    });


});

我需要一种方法来使回发不影响抽屉的状态。如果它是打开的,我希望它在回发后保持打开状态,如果它关闭则在回发后保持关闭状态。所以这意味着我需要它记住它的状态并在每次回发后检查它!

这是我的标签结构。

<div id="fioka">
    <a href="#" ID="prikazi">Click This to show/close</a>
    <div class="sokrij">
</div>
</div>

主要编辑:

在 Crab Bucket 输入之后,这就是我现在所拥有的:

标签结构:

<input type="hidden" ID="hidTracker" value="0" />    
<div id="fioka">
             <a href="#" ID="prikazi">Click This to show/close</a>
             <div class="sokrij">
         </div>
         </div>

这一切都在更新面板中,其中有生成回发的按钮,但这些回发不会刷新主页,它们包含在更新面板中。

到目前为止,jQuery 代码是:

$(document).ready(function () {

if ($('#hidTracker').val() == '1') {
    $(".sokrij").show();
}
else {
    $(".sokrij").hide();

}



  $("#prikazi").live("click", function (evt) {
      evt.preventDefault();

      var panel = $("#fioka").find(".sokrij");

      if (panel.is(":visible")) {
          panel.slideUp("500");
          $('#hidTracker').val('1');
      }
      else {
          panel.slideDown("500");
          $('#hidTracker').val('0');
      }

      return false;
  });


});

所以它现在是这样工作的:在站点加载时,它显示面板(抽屉)已关闭。如果我单击链接以显示/隐藏面板,它的效果非常好。但是在其中一个按钮生成回发后,它会刷新面板,并且每次生成回发时都会显示 OPEN 。在回发之后,我仍然可以使用打开/关闭链接来打开/关闭它并且效果很好,但是我需要一种方法来保存面板在回发之前的状态并在回发之后将其设置为该状态。

隐藏字段提供的代码螃蟹桶也应该适用于此,但它不起作用,我认为我需要一些方法来执行回发后面板是否打开或关闭的检查。因为它只在页面加载时进行检查,而不是在回发之后!

4

2 回答 2

1

您需要自己进行状态跟踪。我为此使用了自己的隐藏字段,即

<input type="hidden" ID="hidTracker" value="0" />

在你的函数的顶部

if($('#hidTracker').val() == '1')
{
    $(".sokrij").show();
}
else
{
    $(".sokrij").hide(); 

}

然后更改您的主要功能体以手动跟踪状态

$("#fioka").find(".sokrij").each(function () 
{              
    if ($(this).is(":visible")) 
    {                 
       $(this).slideUp("500");    
       $('#hidTracker').val('0');          
    }         
});          

if ($(this).next().is(":hidden")) 
{             
   $(this).next().slideDown("500");        
   $('#hidTracker').val('1');          

} 

这仅适用于一个面板 - 这不是您的情况。因此,您将不得不完善此过程以将状态链接到显示为隐藏的面板的 id。

我之前使用相同的原理完成了此操作,但在隐藏字段中记录了 JSON 字符串,然后对其进行再水化,从而能够添加结构键/值信息以记录状态

对于两个面板,隐藏字段中的 JSON 可能如下所示

{"panelState": [{ID:"pnl1", "State":"1"}, {ID:"pnl2", "State":"0"}]}

这是一个json 解析器,可帮助您构建和补充字符串。

要让它继续下去需要做一些工作,但这只是开始。如果我有时间,我会把它充实一点,但我不能保证 - 抱歉

编辑

要适应一个面板,请尝试

var panel = $("#fioka").find(".sokrij");

if (panel.is(":visible"))      
{                         
    panel.slideUp("500");            
    $('#hidTracker').val('1');               
}  
else
{
    panel.slideDown("500");            
    $('#hidTracker').val('0');       
}

不要忘记将所有代码包装在

$(document).ready(function(){

  //all my code

});

否则无法保证加载 DOM,代码可能无法正确执行

编辑 2

很难让显示隐藏代码跟踪 javaScript,但这个奇怪的函数挂钩到更新面板,并在更新面板回发时触发。这将允许您的更新面板跟踪面板状态

 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {

     if($('#hidTracker').val() == '1') 
     {     
         $(".sokrij").show(); 
     } 
     else 
     {     
         $(".sokrij").hide();   
     } 

});

希望能帮助到你

于 2012-02-07T13:16:54.880 回答
0

因此,如果您想隐藏某些内容:

.sokrij
{
    display:none;
}

然后当你想要它显示时:

$(".sokrij").css("display","";

编辑:我误解了你的需求。如果您需要保存信息,请使用会话变量或类似的东西。

if(Session["state"] != null)
    string state = Session["state"].ToString();

if(state  == "0")
{
    $(".sokrij").hide();
}

if (state == "1") { $(".sokrij").hide(); Session["state"]="0"; } }

当然,您可以将字符串更改为整数或布尔值或其他任何值。

于 2012-02-06T23:16:39.877 回答