JQuery

2012-04-03 4 views
0

(я работаю в asp.net) Я ищу способ иметь DIV с jquery.toggle (плюс кнопка меньше /)JQuery

содержания необходимости сНа для загрузки только когда div видимый (нужно скрывать на загрузке страницы).

ли я «НАДО», чтобы иметь страницу с содержанием моего DIV

Или я могу использовать UpdatePanel внутри дел. И позвоните в панель, чтобы загрузить его контент.

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

Любые советы,
бак вы

+0

Итак, вы хотите иметь кнопку, которая получает контент через AJAX, а затем загружает его в div и показывает div? –

+0

Да, но, если возможно, его та же страница, которая получит данные. Я факт, мой div находится на usercontrol, поэтому я хочу поместить его на страницу, и когда я покажу div, управляющая загрузка (и показ) контента. – forX

ответ

1

Я буду регулярно использовать Ajax для загрузки такого содержимого из веб-сервиса или pagemethod (который на самом деле вебсервис ...) , когда значок расширения (+) нажата служба вызывается, данные возвращаются (как JSON), а затем применяются к шаблону, который был загружен внутри скрытого div, когда страница была загружена и вставлена ​​в div, который был переключен на видимый в событии click ...

Если это соответствует вашим потребностям, отлично; Если нет, будьте более конкретными, что вы пытаетесь выполнить.

[Edit: пример кода по запросу]

<div> 
<asp:Repeater ID="CategoryRepeater" runat="server"> 
    <HeaderTemplate><div id="CategorySpace"></HeaderTemplate> 
    <ItemTemplate> 
     <div id="CategoryHeaderRow_<%# Eval("CATEGORY_NM").ToString().Replace(" ","_").Strip("(,),-,/") %>" class="CategoryHeader"> 
      <input type="hidden" id="CategoryID" runat="server" value='<%# Eval("CATEGORY_ID") %>' /> 
      <!-- THIS IS THE EXPANSION ICON --> 
      <input type="button" id="expandCategory_<%# Eval("CATEGORY_NM").ToString() %>" class="CategoryExpandButton" value="+" onclick="expandCategory(this,'<%# ((CRMS.PageBase)this.Page).UserId %>','<%# Eval("CATEGORY_ID") %>');" isloaded="<%#(string)Eval("LOAD_ON_DEMAND_CD")=="N"?"Y":"N" %>" /> 

      <span id="CategoryCount_<%# Eval("CATEGORY_NM").ToString().Replace(" ","_").Strip("(,),-,/") %>" class="CategoryLabel" style="width:50px;"><%# Eval("Count_Qy")%></span> 
      <span id="CategoryName" class="CategoryLabel"><%# Eval("CATEGORY_NM") %></span> 
      <img id="InfoIcon_<%# Eval("CATEGORY_NM") %>" src="images/InfoIcon.png" alt="<%# Eval("CATEGORY_INFO_TX") %>" class="CategoryInfo" /> 
     </div> 
     <div id="categoryItems_<%# Eval("CATEGORY_NM").ToString().Replace(" ","_").Strip("(,),-,/") %>" class="hidden itemsContainer " style="width:990px;overflow:scroll;"> 
      <div id="categoryItems" runat="server"> 
      </div> 
     </div> 

    </ItemTemplate> 
    <FooterTemplate></div></FooterTemplate> 
</asp:Repeater> 
</div> 

Клика событие расширение Icon пожары этого JavaScript:

/* 
Expands the ToDo Categories and initiates ajax call for 
lazy loading ToDo Items when needed 
*/ 
function expandCategory(sender, UserID, CategoryID) { 
    window.status = ""; 
    var senderID = "#" + sender.id; 
    var action = $(senderID).val(); 

    $(senderID).val($(senderID).val() == "+" ? "-" : "+"); 
    var CategoryItemsID = "#" + sender.id.replace("expandCategory", "categoryItems"); 
    $(CategoryItemsID).toggleClass("hidden"); 

    if (action == "+" 
      && sender.isloaded == "N") { 
     //Find any controls with a pq_Value attribute and 
     //use those values with the selected category id 
     //to load items. 
     var params = $('[pq_Value]'); 
     var inputParameters = ""; 
     for (x = 0; x < params.length; x++) { 
      inputParameters += "{" + params[x].p_Name + "|" + params[x].p_Type + "|" + $(params[x]).attr("pq_Value") + "}"; 
     } 
     PageMethods.LoadCategoryItems(UserID, CategoryID, inputParameters, 0, RecieveCategoryData, RecieveCategoryError); 
     //Set Is Loaded to (Y)es 
     sender.isloaded = "Y"; 
    } 
} 

При вызове PageMethods.LoadCategoryItems... это должно быть типичным Аякс вызов для отправки назад содержимое в другую функцию JavaScript:

function RecieveCategoryData(msg) { 
    var msgs = msg.split('||'); 
    if (msgs.length == 7) { 
     var category_name = msgs[0].replace(/ /g, "_"); 

     //strip undesirable characters from the name: (,),-,/ 
     category_name = category_name.replace(/\(/g, "").replace(/\)/g, "").replace(/\-/g, "").replace(/\//g, ""); 
     var UserID = msgs[1]; 
     var jsonData = jQuery.parseJSON(msgs[6]); 

     var container = $("#categoryItems_" + category_name); 
     var categoryCountLabel = $("[id*=CategoryCount_" + category_name + "]")[0] 
     var categoryCount = categoryCountLabel.innerText; 

     if (parseInt(msgs[4]) < 52) { 
      var header = $("#" + category_name + "_Header").html(); 
      $(container).html(header); 
     } 
     //var ItemContainer = $("#" + category_name + "_Items"); 

     var templateText; 
     var x = 0; 
     var y = 0; 
     var fieldName; 
     var fieldToken; 
     var jsonValue; 
     for (i = 0; i < jsonData.length; i++) { 
      templateText = document.getElementById(category_name + "_Template").innerHTML; 

      //templateText = $("#" + category_name + "_Template").html(); 
      templateText = templateText.replace("[{ACTIVE_USER_ID}]", UserID); 
      templateText = templateText.replace("[{numDataRow}]", i % 2 == 0 ? "evenDataRow" : "oddDataRow"); 

      //templateText = templateText.replace("[target]","'" + targetString + "'"); 

      x = templateText.indexOf('[{'); 
      while (x < templateText.length && x > -1) { 
       y = templateText.indexOf('}]', x + 2); 
       fieldToken = templateText.substring(x, y + 2); 
       fieldName = fieldToken.replace('[{', '').replace('}]', '').toUpperCase(); 
       jsonValue = jsonData[i][fieldName]; 

       if (fieldName == "REMARK_TX" && jsonValue != null) { 
        jsonValue = jsonValue.substring(0, jsonValue.length <= 35 ? jsonValue.length : 35); 
       } 

       if (jsonValue != null && 
        jsonValue.toString().indexOf("\Date") > -1 
        ) { 
        if (fieldName != "UPDATED_DT") { 
         jsonValue = new Date(parseInt(jsonValue.substr(6))).format("MM/dd/yyyy"); 
        } else { 
         jsonValue = new Date(parseInt(jsonValue.substr(6))).format("MM/dd/yyyy h:mm:ss tt"); 
        } 
       } else if (jsonValue == null) { 
        jsonValue = ""; 
       } 

       //identify if the value is blank and it is being inserted 
       //into a hyperlink (determined by the ");" following the 
       //replacement token. 
       //If so, insert the "disabled='true'" attribute to the string. 
       if (jsonValue == "" 
        && templateText.substring(y + 2, y + 4) == ");") { 
        var strDisable = " disabled='true'"; 
        var split = y + 5; 
        var beginning = templateText.substring(0, split); 
        var ending = templateText.substring(split); 
        templateText = beginning + strDisable + ending; 

       } 


       templateText = templateText.replace(fieldToken, jsonValue); 


       x = templateText.indexOf('[{'); 
      } 
      //$("#" + category_name + "_Items").append(templateText); 
      $(container).append(templateText); 
     } 

     if (parseInt(msgs[4]) < parseInt(msgs[5])) { //if there are more records remaining to get... 
      PageMethods.LoadCategoryItems(msgs[1], msgs[2], msgs[3], msgs[4], RecieveCategoryData, RecieveCategoryError); 
     } 

     if (getParameterByName("showCount")) { 
      if (parseInt(msgs[4]) < parseInt(msgs[5])) { 
       window.status = "Loading " + msgs[4] + " of " + msgs[5] + "."; 
      } else if (parseInt(msgs[4]) == parseInt(msgs[5])) { 
       window.status = "Load Complete: " + msgs[5] + " records."; 
      } else { //if (parseInt(categoryCount) != parseInt(msgs[4] 
       window.status = "expecting records: " + categoryCount + " showing records: " + parseInt(msgs[4]); 
      } 
     } 

     //format currency cells to $x,xxx.cc 
     //var test = $(".jq_currFormat"); 
     $(".jq_currFormat").each(function() { 
      var num = $(this).text(); 
      if (num.indexOf("]") == -1) { 
       num = num.toString().replace(/\$|\,/g, ''); 
       if (isNaN(num)) num = "0"; 
       sign = (num == (num = Math.abs(num))); 
       num = Math.floor(num * 100 + 0.50000000001); 
       cents = num % 100; 
       num = Math.floor(num/100).toString(); 
       if (cents < 10) cents = "0" + cents; 
       for (var i = 0; i < Math.floor((num.length - (1 + i))/3); i++) 
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3)); 
       $(this).text((((sign) ? '' : '-') + '$' + num + '.' + cents)); 
       $(this).removeClass("jq_currFormat"); 
      } 
     }); 


    } 
} 

T его функция будет идентифицировать и скопировать шаблон для категории отображаемых данных и найти и заменить токены данных фактическими значениями из JSON.

+0

что-то вроде вашей вещи, но контент находится в usercontrol. Итак, я думаю, чтобы создать usercontrol «A». «A» имеет контроль расширения. при щелчке, он показывает usercontrol «B». «B» полный набор, чтобы получить данные и показать их. Итак, как «A» может загрузить «B»? – forX

+0

Окончательно, я решил использовать updatepanel на моем контроле, , используя обратную передачу для загрузки содержимого. бак для вашего ответа. Если я вижу, что он слишком тяжелый, я буду искать больше загрузок jquery. – forX

+0

У вас есть образец кода для значка расширения? – forX

0

Я делал это много раз, я обычно спрячу свой div на самой верхней части javascript, а затем показываю, какое событие имеет смысл. То, как вы загружаете div, не имеет значения, единственное, что я иногда нахожу раздражающим, - это найти соответствующий div, так как мы все еще используем способ перезаписи имен ASP.NET. Это легко исправить, используя концы с селектором в jQuery.

НТН

+0

Используйте .NET 4 или выше и установите для параметра ClientIdMode значение static (или предсказуемое, в зависимости от ситуации). – walther

+0

Я в .net 3.5 – forX

+0

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

0

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

<a href="#" id="link">Show</a> 

<div id="divMore" style="display:none;"> 
    <p>some content goes here</p> 
</div> 

и сценарий

$(function(){ 
    $("#link").click(function(){  
     if($(this).text()=="Show") 
     { 
      $("#divMore").slideDown(); 
      $(this).text("Hide"); 
     } 
     else 
     { 
      $("#divMore").slideUp(); 
      $(this).text("Show"); 
     }   
    });  
});​ 

Образец одного образца http://jsfiddle.net/VdPAz/8/

Если у вас есть t о показать некоторые большой динамический контент, основанный на некотором элементе на странице (например: Отображение истории платежей в таблице при щелчке на имени пользователя), вы можете сделать JQuery нагрузки, чтобы получить, что данные

var userId=5; // read from the page/source of click 
$("#divMore").load("getuserdata.php?userid="+userId); 
+0

может быть что-то вроде этого с чем-то вроде этого: http://www.codeproject.com/Articles/117475/Load-ASP-Net-User-Control-Dynamically-Using-jQuery Я могу загрузить мой элемент управления с загрузкой jquery – forX

0

Конечно, вы можете использовать для этого UserControl.

Это будет кодогенератора в:

<tr> 
    <td> 
     <asp:UpdatePanel runat="server" ID="uppShowB" UpdateMode="Conditional"> 
      <ContentTemplate> 
       <br /> 
       <asp:LinkButton runat="server" ID="btnShowB" Text="(+)" 
        OnClick="btnShowB_Click"></asp:LinkButton> 
       <wuc:BControl runat="server" ID="wucBControl" /> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </td> 
</tr> 

//Invocation of the javascript function that will show ControlB as a jquery Dialog 
protected void btnShowB_Click(object sender, EventArgs e) 
{ 
    ScriptManager.RegisterStartupScript(this.uppShowB, typeof(UpdatePanel), "popupB", "ShowB('" + this.wucBControl.GetPanelId() + "," + this.btnShowB.ClientID + "');", true); 
} 

В ControlB, вы должны поместить все внутри панели и убедитесь, что он не имеет дисплея: ни в своем стиле

<asp:Panel runat="server" ID="pnlBPanel" CssClass="Invisible"> 

</asp:Panel> 

//and in the css: 

.Invisible 
{ 
    display: none; 
} 

//and in the cs: 
public string GetPanelId() 
{ 
    return this.pnlPopUpDetalles.ClientID; 
} 

И, наконец, , функция javascript, которая показывает ControlB: (отображается без заголовка и под кнопкой переключения (+). Возможно, координаты должны быть скорректированы)

function ShowB(panelClientId, btnToggleClientId) 
{   
    ancho = 250; 
    alto = 'auto'; 
    var x = $("#btnToggleClientId").offset().left + $("#btnToggleClientId").outerWidth() - ancho; 
    var y = $("#btnToggleClientId").offset().top + $("#btnToggleClientId").outerHeight() - $(document).scrollTop();    
    var $dialog = $("#panelClientId") 
     .dialog({ 
      autoOpen: false, 
      hide: "puff",     
      width: ancho, 
      height: alto, 
      draggable: false, 
      resizable: true, 
      closeOnScape : true, 
      position: [x,y]      
     }); 
    $dialog.dialog("open");    
    $("#panelClientId").siblings(".ui-dialog-titlebar").hide(); 

    $("#panelClientId").focus(); 

    $("body") 
     .bind(
     "click", 
     function(e){ 
      if(
       $("#panelClientId").dialog("isOpen") 
       && !$(e.target).is(".ui-dialog, a") 
       && !$(e.target).closest(".ui-dialog").length 
      ) 
      { 
      jQuery("#panelClientId").dialog("close"); 
      } 
     });       
    return false; 
}