Прозрачная кнопка LinkButton в репитере ASP при событии щелчка jquery

Введение:

У меня есть повторитель с кнопками ссылок, и когда я нажимаю на какую-то кнопку, я хочу, чтобы он и только он стал прозрачным, а остальные кнопки не менялись.

D-хвосты:

У меня есть повторитель LinkButtons:

<div style="position: relative">
<asp:Repeater runat="server" ID="repStatuses" 
        onitemdatabound="repStatuses_ItemDataBound"
        onitemcommand="repStatuses_ItemCommand">
  <ItemTemplate>
        <div id="divLinkBtn" style="display:inline"><asp:LinkButton ID="linkBtnStatuses" runat="server" CommandName="ShowText" 
            CommandArgument='<%# Eval("Priority") + ";" + Eval("LevelID") + ";" + Eval("ID") %>'
            OnClientClick='<%# "MyFunc(" + Eval("Priority") + ");" %>'>
            <div runat="server" id="divSts" class="fontAriel" ></div>
        </asp:LinkButton></div>
  </ItemTemplate>
    </asp:Repeater>
</div>

LinkButton постепенно появляются на странице Page_Load с помощью следующей функции JQuery. Вот Page_Load и код jquery:

Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
    SetPageTitle();

    if (!Page.IsPostBack)
    {
        LoadStatusesAndButtons();

        ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "<script type='text/javascript'>LoadBarWithFadeIN();</script>", false);
    }

    else
        ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "<script type='text/javascript'>LoadBar();</script>", false);

}

JQuery

function LoadBarWithFadeIN() {
$(document).ready(function () {

    $('a[id*="repStatuses"]').each(function () {
        $(this).show(2500);
        $(this).delay(1000);
    });
});

}

function LoadBar() {
$(document).ready(function () {

    $('a[id*="repStatuses"]').each(function () {
        $(this).show(0);

    });
});

}

Когда я нажимаю какой-нибудь LinkButton, он становится прозрачным. Я обнаружил, что этот code делает прозрачными только первые кнопки ссылок:

  $(document).ready(function () {
  $('#divLinkBtn').click(function () {
      alert('divlinkbutton presed');
      $(this).css({ 'opacity': 0.4 });
  });
});

ПРОБЛЕМА в том, что кнопка становится прозрачной на секунду, а затем страница загружает функцию LoadBar(), и прозрачность исчезает. Другое дело, что эта функция не обрабатывает остальные кнопки.

Теперь мне нужно, чтобы эта кнопка LinkButton оставалась прозрачной, пока я не нажму другую кнопку ссылки.

Я думал о способе загрузить все не нажатые кнопки как есть и каким-то образом загрузить конкретную нажатую кнопку с прозрачностью, но я не могу найти способ сделать это из-за отсутствия опыта программирования.

Простите за "короткий" пост :)

Любая помощь будет очень признательна !!!!!


person Yanker    schedule 01.01.2013    source источник
comment
вы использовали display: block в стиле j   -  person skhurams    schedule 01.01.2013
comment
Я использовал display: inline. (display: block заставляет кнопки ссылок двигаться вертикально, а я хочу их горизонтально).   -  person Yanker    schedule 01.01.2013
comment
Думаю, вам понадобится это: github.com/carhartl/jquery-cookie   -  person Jai    schedule 01.01.2013
comment
Проблема с @skhurams заключается в том, что прозрачность загрузки страницы теряется, и она становится полностью непрозрачной.   -  person Jai    schedule 01.01.2013
comment
Я редактировал функцию прозрачности jquery и ее описание ниже. Проверьте, пожалуйста, редакции.   -  person Yanker    schedule 01.01.2013
comment
Джай, я не понимаю, зачем мне это ???   -  person Yanker    schedule 01.01.2013


Ответы (2)


Вероятная причина, по которой кнопка снова появляется после загрузки второй страницы, заключается в том, что ваши изменения, сделанные в jQuery, не сохраняются в ViewState и поэтому не сохраняются при обратных передачах. Если вы получаете обратную передачу при LinkButton щелчке, вы можете сохранить информацию о том, что он был нажат на стороне сервера (т. Е. В добавлении класса clicked в свой код C #, обрабатывающий событие щелчка). Затем вы можете изменить клиентский сценарий, чтобы установить прозрачность для всех LinkButton элементов управления с этим классом (и некоторой специальной обработки для кнопки, нажатой недавно). Вы также можете просто определить класс, дающий элементам соответствующие настройки прозрачности. Сообщите мне, если Вам понадобится помощь с кодом для этого.

Что касается второй проблемы, обратите внимание, что вы получаете элемент по идентификатору, и он должен быть уникальным в рамках HTML-страницы. Наверное, поэтому работает только для первого. Чтобы он работал для всех элементов, используйте вместо этого класс. Вы можете назначить класс в своем aspx следующим образом:

<div id="divLinkBtn" class="divLnkBtnClass" style="display:inline">... </div>

и назначьте обработчик кликов следующим образом:

$(document).ready(function () {
$('.divLnkBtnClass').click(function () {
  alert('divlinkbutton presed');
  $(this).css({ 'opacity': 0.4 });
});
});

Это должно заставить скрипт работать для всех div.

Я еще не тестировал этот код, поэтому, пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы с ним, чтобы я мог исправить это и помочь вам заставить его работать правильно.

ОБНОВЛЕНИЕ

Есть несколько способов сохранить прозрачность обратных передач. Вы получаете обратную передачу при каждом щелчке по элементу, поэтому я полагаю, что сохранение и восстановление на стороне сервера было бы одним из самых простых способов добиться желаемого эффекта.

  • Сначала добавьте личное поле на свою страницу в коде программной части:

    private List<String> itemsClicked = null;
    

    и элемент управления HiddenField в вашем aspx (вне элемента управления Repeater):

    <asp:HiddenField runat="server" ID="hfButtonsClicked" Value="" />
    

    Мы будем использовать этот HiddenField для сохранения ClientID из LinkButton элементов управления, которые уже были нажаты.

  • Затем в методе Page_Load инициализируйте поле значением из скрытого поля:

    protected void Page_Load(object sender, EventArgs e)
    {
        SetPageTitle();
    
        //initialize itemsClicked before binding data to the repeater
        itemsClicked = hfButtonsClicked.Value.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList();
    
        if (!Page.IsPostBack)
        {
            LoadStatusesAndButtons();
    
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "<script type='text/javascript'>LoadBarWithFadeIN();</script>", false);
        }
        else
        {
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "<script type='text/javascript'>LoadBar();</script>", false);
        }
    }
    
  • Затем добавьте на страницу новый метод, который будет использоваться на следующем шаге:

    private void SetOpacity(LinkButton linkButton, string opacityValue)
    {
        linkButton.Style.Remove("opacity");
        linkButton.Style.Add("opacity", opacityValue);
    }
    
  • Последнее, что нужно добавить - это добавить код, сохраняющий идентификатор при щелчке по элементу. Вы можете использовать событие щелчка или просто использовать существующий обработчик событий OnItemCommand:

    protected void repStatuses_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        //get LinkButton that was clicked
        LinkButton lnkBtnClicked = (e.CommandSource as LinkButton);
        if (lnkBtnClicked != null)
        {
            //if item was not clicked before, so the opacity is not set
            if (lnkBtnClicked.Style["opacity"] == null)
            {
                //save control ClientID in the HiddenField
                hfButtonsClicked.Value += String.Format(";{0}", lnkBtnClicked.ClientID);
    
                SetOpacity(lnkBtnClicked, "0.4");
            }
        }
    
        //the rest of the original code should be here
        //...
    }
    

и метод восстановления непрозрачности после обратной передачи, когда элемент привязан к данным:

    protected void repStatuses_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        LinkButton lnkBtn = (e.Item.FindControl("linkBtnStatuses") as LinkButton);

        if (lnkBtn != null)
        {
            //if item was clicked before, so the opacity should be restored
            if (itemsClicked.Contains(lnkBtn.ClientID))
            {
                SetOpacity(lnkBtn, "0.4");
            }
        }

        //the rest of the original code should be here
        //...
    }

Я реализовал это в примере приложения, и, похоже, он работает так, как ожидалось. Сообщите мне, если у Вас возникнут трудности с этим кодом.

Дополнительные примечания

Вы также можете использовать объект ViewState вместо этого дополнительный элемент управления HiddenField, но если вы захотите в конечном итоге изменить решение для сохранения / восстановления непрозрачности в jQuery, работа с HiddenField должна быть намного проще.

Есть также некоторые улучшения, которые следует внести в код (например, переместить разделитель строк в переменную только для чтения или не задавать жесткое кодирование значения атрибута непрозрачности), но я написал это таким образом, чтобы сделать ответ короче и немного легче читать.

person Lukasz M    schedule 01.01.2013
comment
Вторая часть отлично работает. Спасибо :) Что касается первой части, то не до конца разобрался, может, я вас не понял. Помощь с кодом может быть отличной идеей. - person Yanker; 01.01.2013
comment
Хорошо, я пока постараюсь найти решение - person Yanker; 02.01.2013
comment
Я только что обновил свой ответ, пожалуйста, взгляните на него и дайте мне знать, работает ли он для Вас. - person Lukasz M; 02.01.2013
comment
Это прекрасно работает. Слишком хорошо :) Мне нужно, чтобы кнопка стала прозрачной, остальные кнопки должны вернуться в нормальное состояние. Спасибо - person Yanker; 02.01.2013
comment
О, я вижу. Должен ли я отредактировать ответ, чтобы он работал таким образом? Если ответ в этой форме вас устраивает, примите его :). - person Lukasz M; 02.01.2013
comment
Нет, предпочитаю делать сам :) Еще раз спасибо, Лукаш - person Yanker; 02.01.2013
comment
Просто хотел спросить: зачем мне такая строка: linkButton.Style.Remove("opacity"); в SetOpacity методе ?? - person Yanker; 02.01.2013
comment
Я не был уверен, будет ли он работать правильно без этой строки, когда для элемента уже определен opacity ключ. Фактически, в repStatuses_ItemDataBound также есть дополнительная проверка для этого, поэтому упомянутая Вами строка не нужна. - person Lukasz M; 02.01.2013
comment
Если честно, я удалил большую часть кода, и он почему-то все еще работает и сохраняет все кнопки как прозрачные. Бог знает как. Удивительно то, что я застрял в исходной миссии - сделать прозрачной только нажатую кнопку ... ну да ладно - person Yanker; 03.01.2013
comment
Вероятно, это потому, что большая часть кода отвечает за сохранение нескольких кнопок;). - person Lukasz M; 03.01.2013

После хорошего ночного сна вот простое (хотя и не самое элегантное) решение:

 protected void repStatuses_ItemCommand(object source, RepeaterCommandEventArgs e)
{
   SetAsOriginal();

    //Get the linkbutton that was clicked
    LinkButton lnkBtnClicked = e.CommandSource as LinkButton;       //e- is the object of the repeater. CommandSource- is the clicked
    if (lnkBtnClicked != null)
    {
        SetOpacity(lnkBtnClicked, "0.4");
    }

private void SetAsOriginal()
{
    foreach (RepeaterItem item in repStatuses.Items)
    {
        LinkButton btn = item.FindControl("linkBtnStatuses") as LinkButton;
        SetOpacity(btn, "1.0");
    }
}

private void SetOpacity(LinkButton linkButton, string opacityValue)         //SET THE OPACITY TO THE SPECIFIC linkbutton 
{
    linkButton.Style.Add("opacity", opacityValue);
}

Дело в том, что приведенный выше ответ был очень хорош и работал, но не отвечал на мое требование. Мне нужно было сделать прозрачной только нажатую кнопку, а остальные кнопки нужно вернуть обратно к оригиналу.

Поэтому я решил указать решение для тех, кто может столкнуться с подобной проблемой.

всем спасибо.

PS: особая благодарность @Lukasz M

person Yanker    schedule 03.01.2013
comment
Вы даже можете удалить SetAsOriginal метод, и он все равно должен работать правильно :). - person Lukasz M; 03.01.2013
comment
Здесь я не согласен! Сначала у меня не было этого метода, и бог знает по этой причине, он постоянно запоминал предыдущие нажатые кнопки, и они оставались прозрачными. Было бы здорово, если бы вы нашли для этого причину. Но я SetAsOriginal именно по этой причине ... - person Yanker; 04.01.2013
comment
Вы правы, я раньше не замечал этой разницы, но в примере приложения, который я написал, DataSource из Repeater был отскок при каждой обратной передаче, что привело к автоматическому удалению изменений непрозрачности. Однако в вашем коде кажется, что вы устанавливаете DataSource только при загрузке первой страницы, поэтому изменения стиля обрабатываются ViewState и автоматически восстанавливаются после обратной передачи. Вероятно, поэтому вам нужно было вручную установить исходную непрозрачность. - person Lukasz M; 05.01.2013