programing

jQuery $(문서)ready 및 Update Panels?

shortcode 2022. 9. 13. 22:24
반응형

jQuery $(문서)ready 및 Update Panels?

[ Query ]panel [ Update Panel ]를 선택합니다.은 에 있다.$(document).ready §:

$(function() {    
    $('div._Foo').bind("mouseover", function(e) {
        // Do something exciting
    });    
});

물론 처음 페이지를 로드했을 때는 정상적으로 동작하지만 UpdatePanel이 부분적인 페이지 업데이트를 하면 실행되지 않고 마우스 오버 효과가 UpdatePanel 내에서 더 이상 작동하지 않습니다.

첫 페이지 로드 시뿐만 아니라 UpdatePanel이 부분 페이지 업데이트를 시작할 때마다 jQuery에 자료를 연결할 때 권장되는 접근 방식은 무엇입니까?ASP? AJAX 라이프 $(document).ready

UpdatePanel은 업데이트 시 업데이트 패널의 내용을 완전히 대체합니다.즉, 해당 업데이트 패널에 새 요소가 있기 때문에 구독한 이벤트가 구독되지 않습니다.

이 문제를 해결하기 위해 제가 한 일은 업데이트 후 필요한 이벤트를 다시 구독하는 것입니다. 용 i i i i를 쓴다.$(document).ready()초기 로드에 대해서는, Microsoft 의 것(페이지에 업데이트 패널이 있는 경우 사용 가능)을 사용해 모든 업데이트를 재서브스크라이브 합니다.

$(document).ready(function() {
    // bind your jQuery events here initially
});

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(function() {
    // re-bind your jQuery events here
});

PageRequestManager는 업데이트 패널이 페이지에 있는 경우 자동으로 사용할 수 있는 Javascript 객체입니다.UpdatePanel이 페이지에 있는 한 위의 코드 이외의 작업을 수행할 필요가 없습니다.

보다 자세한 제어가 필요한 경우 이 이벤트는 how와 유사한 인수를 전달합니다.는 NET 인수로 됩니다.(sender, eventArgs)이벤트 발생 원인을 확인하고 필요한 경우에만 다시 확인할 수 있습니다.

Microsoft 의 메뉴얼의 최신 버전을 다음에 나타냅니다.msdn.microsoft.com/ ... / bb383810 . aspx


필요에 따라 jQuery를 사용하는 것이 좋습니다.이러한 방법은 업데이트 시마다 DOM 요소에 재서브스크라이브 하는 것보다 효율적입니다.다만, 이 어프로치를 사용하기 전에, 모든 메뉴얼을 읽어 주세요.필요에 따라서는 대응할 수도 있고 그렇지 않을 수도 있기 때문입니다.jQuery 플러그인은 리팩터로 사용할 수 없는 경우가 많습니다..delegate() ★★★★★★★★★★★★★★★★★」.on()그런 경우에는 다시 하는 게 좋을 것 같아요.

<script type="text/javascript">

        function BindEvents() {
            $(document).ready(function() {
                $(".tr-base").mouseover(function() {
                    $(this).toggleClass("trHover");
                }).mouseout(function() {
                    $(this).removeClass("trHover");
                });
         }
</script>

갱신되는 영역.

<asp:UpdatePanel...
<ContentTemplate
     <script type="text/javascript">
                    Sys.Application.add_load(BindEvents);
     </script>
 *// Staff*
</ContentTemplate>
    </asp:UpdatePanel>

UpdatePanel 내의 jQuery를 사용한 사용자 제어

질문에 대한 직접적인 답변은 아니지만, 여기서 찾은 답을 읽고 이 해결책을 종합해 보았습니다.누군가 유용하다고 생각할지도 모른다고 생각했습니다.

사용자 컨트롤 내에서 jQuery 텍스트 영역 제한 장치를 사용하려고 했습니다.이는 사용자 컨트롤이 UpdatePanel 내에서 실행되고 콜백 시 바인딩이 손실되었기 때문에 까다로웠습니다.

만약 이것이 페이지였다면, 이 답변은 바로 적용되었을 것입니다.그러나 사용자 컨트롤은 헤드 태그에 직접 액세스할 수 없으며 일부 답변에서 가정한 것처럼 UpdatePanel에 직접 액세스할 수도 없습니다.

결국 이 스크립트 블록을 사용자 컨트롤 마크업 상단에 넣게 되었습니다.첫 번째 바인딩에는 $(문서)가 사용됩니다.prm.add_endRequest를 사용합니다.

<script type="text/javascript">
    function BindControlEvents() {
        //jQuery is wrapped in BindEvents function so it can be re-bound after each callback.
        //Your code would replace the following line:
            $('#<%= TextProtocolDrugInstructions.ClientID %>').limit('100', '#charsLeft_Instructions');            
    }

    //Initial bind
    $(document).ready(function () {
        BindControlEvents();
    });

    //Re-bind for callbacks
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 

    prm.add_endRequest(function() { 
        BindControlEvents();
    }); 

</script>

그래서... 이게 효과가 있다는 걸 누군가 알고 싶어할 것 같아서요

jQuery 1.3으로 업그레이드하여 다음을 사용합니다.

$(function() {

    $('div._Foo').live("mouseover", function(e) {
        // Do something exciting
    });

});

주의: 라이브는 대부분의 이벤트와 함께 작동하지만 모든 이벤트에서는 작동하지 않습니다.문서에는 완전한 목록이 있습니다.

다음과 같은 방법도 있습니다.

<asp:UpdatePanel runat="server" ID="myUpdatePanel">
    <ContentTemplate>

        <script type="text/javascript" language="javascript">
        function pageLoad() {
           $('div._Foo').bind("mouseover", function(e) {
               // Do something exciting
           });
        }
        </script>

    </ContentTemplate>
</asp:UpdatePanel>

pageLoad()는 ASP이기 때문입니다.클라이언트 측에서 페이지가 로드될 때마다 실행되는 NET Ajax 이벤트입니다.

제 대답이요?

function pageLoad() {

  $(document).ready(function(){

기타.

마법처럼 작동했고, 많은 다른 해결책들이 비참하게 실패했어요.

다음 방법 중 하나를 사용합니다.

  1. 이벤트 바인딩을 함수에 캡슐화하여 페이지를 갱신할 때마다 실행합니다.이벤트가 같은 요소에 여러 번 바인딩되지 않도록 항상 특정 요소에 대한 이벤트 바인딩을 포함할 수 있습니다.

  2. 기본적으로 방법 1을 자동으로 수행하는 라이브쿼리 플러그인을 사용합니다.이벤트 바인딩에 대한 제어 정도에 따라 기본 설정이 달라질 수 있습니다.

pageLoad() 함수는 이 상황에서 사용하면 매우 위험합니다.이벤트가 여러 번 유선 연결될 수 있습니다.또한 .live()는 문서 요소에 부착되어 페이지 전체를 통과해야 하기 때문에 접근하지 않습니다(느리고 불안정합니다).

지금까지 본 최고의 솔루션은 업데이트 패널 외부의 래퍼에 jQuery .delegate() 함수를 사용하여 버블링을 사용하는 것입니다.그 이외의 경우 UpdatePanels에서 동작하도록 설계된 Microsoft의 Ajax 라이브러리를 사용하여 핸들러를 배선할 수 있습니다.

$(document).ready(function (){...}) 후 합니다.

<script type="text/javascript" language="javascript">
function pageLoad() {
// Initialization code here, meant to run once. 
}
</script>

저도 비슷한 문제가 있었는데, 가장 효과적인 방법은 이벤트 버블링과 이벤트 위임에 의존하는 것이었습니다.이벤트 위임의 장점은 AJAX 업데이트 후 이벤트를 다시 바인딩할 필요가 없다는 것입니다.

내 코드로 수행하는 작업은 업데이트 패널의 상위 요소에 위임자를 설정하는 것입니다.이 부모 요소는 업데이트 시 교체되지 않으므로 이벤트바인딩은 영향을 받지 않습니다.

jQuery에는 이벤트 위임을 처리하기 위한 다수의 좋은 문서와 플러그인이 있으며, 이 기능은 1.3 릴리즈에 포함될 예정입니다.참조용으로 사용하는 문서/플러그인은 다음과 같습니다.

http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery

어떤 일이 일어나는지 이해하면 업데이트 후 이벤트를 재바인드하는 것보다 훨씬 더 신뢰할 수 있는 솔루션이라는 것을 알게 될 것입니다.또한 페이지가 언로드될 때 바인딩 해제할 수 있는 이벤트가 하나 있다는 이점도 있습니다.

WWIW, 저도 비슷한 문제가 있었습니다.이벤트 재접속은 올바른 조치였지만 요청 마지막에 수행해야 했습니다.

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function() {... 

beginRequest로 인해 늘 참조 JS 예외가 발생할 경우 유의해야 할 사항입니다.

건배.

pageLoad = function () {
    $('#div').unbind();
    //jquery here
}

pageLoad 기능은 초기 페이지 로드 및 모든 업데이트패널 비동기 포스트백에서 실행되므로 이 경우에 매우 적합합니다.업데이트 패널 포스트백에서 jquery를 작동시키기 위해 unbind 메서드를 추가해야 했습니다.

http://encosia.com/document-ready-and-pageload-are-not-the-same/

제 답변은 위의 모든 전문가 코멘트에 기초하고 있지만, 아래는 각 포스트백과 비동기 포스트백에서 JavaScript 코드가 실행되도록 하기 위해 누구나 사용할 수 있는 다음 코드입니다.

저 같은 경우에는 한 페이지 안에 사용자 컨트롤이 있습니다.아래 코드를 사용자 컨트롤에 붙여넣기만 하면 됩니다.

<script type="text/javascript"> 
        var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(EndRequestHandler);
    function EndRequestHandler(sender, args) {
        if (args.get_error() == undefined) {
            UPDATEPANELFUNCTION();
        }                   
    }

    function UPDATEPANELFUNCTION() {
        jQuery(document).ready(function ($) {
            /* Insert all your jQuery events and function calls */
        });
    }

    UPDATEPANELFUNCTION(); 

</script>

Update Panel은 로드 후 항상 Jquery를 내장된 Script Manager 스크립트로 바꿉니다.pageRequestManager의 인스턴스 메서드를 사용하는 것이 좋습니다.

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest)
    function onEndRequest(sender, args) {
       // your jquery code here
      });

잘 될 거야...

아래 스크립트를 사용하여 스크립트의 본문을 적절히 변경합니다.

       <script>
        //Re-Create for on page postbacks
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_endRequest(function () {
           //your codes here!
        });
    </script>

Brian McKay의 답변:

JavaScript를 UserControl의 HTML에 직접 넣는 대신 Script Manager를 통해 페이지에 삽입합니다.내 경우 UpdatePanel이 종료되고 반환된 후 표시되는 폼으로 스크롤해야 합니다.이것은 파일 뒤에 있는 코드에 들어갑니다.제 샘플에서는 메인 콘텐츠 페이지에 prm 변수를 이미 작성했습니다.

private void ShowForm(bool pShowForm) {
    //other code here...
    if (pShowForm) {
        FocusOnControl(GetFocusOnFormScript(yourControl.ClientID), yourControl.ClientID);
    }
}

private void FocusOnControl(string pScript, string pControlId) {
    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "focusControl_" + pControlId, pScript, true);
}

/// <summary>
/// Scrolls to the form that is made visible
/// </summary>
/// <param name="pControlId">The ClientID of the control to focus on after the form is made visible</param>
/// <returns></returns>
private string GetFocusOnFormScript(string pControlId) {
    string script = @"
    function FocusOnForm() {
        var scrollToForm = $('#" + pControlId + @"').offset().top;
        $('html, body').animate({ 
            scrollTop: scrollToForm}, 
            'slow'
        );
        /* This removes the event from the PageRequestManager immediately after the desired functionality is completed so that multiple events are not added */
        prm.remove_endRequest(ScrollFocusToFormCaller);
    }
    prm.add_endRequest(ScrollFocusToFormCaller);
    function ScrollFocusToFormCaller(sender, args) {
        if (args.get_error() == undefined) {
            FocusOnForm();
        }
    }";
    return script;
}
Sys.Application.add_load(LoadHandler); //This load handler solved update panel did not bind control after partial postback
function LoadHandler() {
        $(document).ready(function () {
        //rebind any events here for controls under update panel
        });
}

제 상황에 처한 다른 사용자를 위해 DevExpress ASPxCallbackPanel에서 jquery document ready 기능을 사용하려고 했지만, 지금까지 아무 것도 작동하지 않았습니다.이게 나한테 효과가 있었던 거야

<script>
function myDocReadyFunction(){ /* do stuff */  }
</script>

<dx:ASPxCallbackPanel ID="myCallbackPanel" ... >
    <ClientSideEvents EndCallback="function(){ myDocReadyFunction();}"> 
    </ClientSideEvents>
    <PanelCollection ...>
</dx:ASPxCallbackPanel>

언급URL : https://stackoverflow.com/questions/256195/jquery-document-ready-and-updatepanels

반응형