programing

OnclientClick과 OnClick이 동시에 작동하지 않습니까?

minimums 2023. 9. 15. 20:53
반응형

OnclientClick과 OnClick이 동시에 작동하지 않습니까?

다음과 같은 버튼이 있습니다.

<asp:Button ID="pagerLeftButton" runat="server" OnClientClick="disable(this)" onclick="pager_Left_Click" Text="<" />

버튼을 그렇게 사용하면 on click이 켜지지 않습니다.OnClientClick을 제거하면 onClick이 실행됩니다.

제가 해야 할 일은 포스트백 중에는 버튼을 비활성화하고 포스트백이 끝난 후에는 활성화하는 것입니다.

편집: 추가 정보:

제 발화 기능에 c# part에 breakpoint를 추가했고 디버깅을 하고 있습니다. 확실히 발화하지는 않습니다.그 기능들은.

protected void pager_Left_Click(object sender, EventArgs e)
{
//Do smthing.
}
protected void pager_Right_Click(object sender, EventArgs e)
{
//Do smthing.
}

그리고 버튼을 클릭하면 1-2초 동안 비활성화되어 자동으로 활성화되는데 왜 활성화되는지 잘 모르겠습니다.다시 활성화할 부분을 추가하지 않았습니다.

web.archive.org 의 이 기사에서:

방법은 버튼 컨트롤의 OnClientClick 및 UseSubmitBehavior 속성을 사용하는 것입니다.속성을 추가하기 위해 서버 측의 코드를 포함하는 다른 방법도 있지만, 이런 방식으로 수행하는 단순함이 훨씬 더 매력적이라고 생각합니다.

<asp:Button runat="server" ID="BtnSubmit"  OnClientClick="this.disabled = true; this.value = 'Submitting...';"   UseSubmitBehavior="false"  OnClick="BtnSubmit_Click"  Text="Submit Me!" />

OnClientClick을 사용하면 클라이언트 측 OnClick 스크립트를 추가할 수 있습니다.이 경우, 자바스크립트는 버튼 요소를 비활성화하고 텍스트 값을 진행 메시지로 변경합니다.포스트백이 완료되면 새로 렌더링된 페이지는 추가 작업 없이 버튼을 초기 상태로 되돌립니다.

클라이언트 측에서 제출 버튼을 비활성화할 때 발생하는 한 가지 함정은 브라우저의 제출을 취소하고 따라서 포스트백을 수행한다는 것입니다.UseSubmitBehavior 속성을 false로 설정하면 알 수 있습니다.브라우저의 양식 제출 동작에 의존하지 않고 필요한 클라이언트 스크립트를 주입하여 포스트백을 실행합니다.이 경우에 주입되는 코드는 다음과 같습니다.

__doPostBack('BtnSubmit','')

이는 OnClientClick 코드의 끝에 추가되어 다음과 같은 렌더링된 HTML을 제공합니다.

<input type="button" name="BtnSubmit"  onclick="this.disabled = true; this.value ='Submitting...';__doPostBack('BtnSubmit','')"  value="Submit Me!" id="BtnSubmit" />

이렇게 하면 좋은 버튼 비활성화 효과와 텍스트 처리가 가능하고 포스트백이 완료됩니다.

OnClientClick은 OnClick과 함께 사용할 때 매우 까다로워 보입니다.

다음과 같은 사용 사례를 사용해 보았지만 실패했습니다.

OnClientClick="return ValidateSearch();" 
OnClientClick="if(ValidateSearch()) return true;"
OnClientClick="ValidateSearch();"

하지만 그들은 효과가 없었습니다.다음이 작동했습니다.

<asp:Button ID="keywordSearch" runat="server" Text="Search" TabIndex="1" 
  OnClick="keywordSearch_Click" 
  OnClientClick="if (!ValidateSearch()) { return false;};" />

여기에는 두 가지 문제가 있습니다.

클라이언트 측의 버튼을 비활성화하면 포스트백이 방지됩니다.

이를 극복하기 위해 자바스크립트 다음에 버튼을 비활성화 합니다.onclickevent. 이를 위한 쉬운 방법은 사용하는 것입니다.setTimeout 회답이

그리고 또.OnClientClickASP가 실행되어도 코드가 실행됩니다.NET 유효성 검사가 실패하므로 다음 항목에 대한 검사를 추가하는 것이 좋을 것입니다.Page_IsValid. 이렇게 하면 유효성 검사에 실패해도 버튼이 비활성화되지 않습니다.

OnClientClick="(function(button) { setTimeout(function () { if (Page_IsValid) button.disabled = true; }, 0); })(this);"

질문에서 알 수 있듯이 이 모든 자바스크립트 코드를 자체 기능에 넣는 것이 더 좋습니다.

OnClientClick="disable(this);"

function disable(button) {
    setTimeout(function () {
        if (Page_IsValid)
            button.disabled = true;
    }, 0);
}

클라이언트 측에서 단추를 비활성화해도 서버 측에서 단추를 비활성화하지 않습니다.

이 문제를 해결하려면 서버 쪽의 단추를 비활성화합니다.예를 들면.OnClick이벤트 처리기:

OnClick="Button1_Click"

protected void Button1_Click(object sender, EventArgs e)
{
    ((Button)sender).Enabled = false;
}

마지막으로 중복 버튼 누르기를 방지하는 것은 서로 다른 두 사용자가 동일한 데이터를 동시에 제출하는 것을 방지하지 못합니다.서버 쪽에서 그 점을 반드시 고려해 주시기 바랍니다.

Vinay(위)는 효과적인 해결책을 제시했습니다.실제로 OnClientClick 이벤트 기능 이후 버튼의 OnClick 이벤트가 작동하지 않는 이유는 버튼이 비활성화되면(OnClientClick 이벤트에서 호출하는 기능에서) 버튼이 OnClick 이벤트의 정의된 메서드를 호출하여 버튼의 작업을 완료하지 않음으로써 버튼이 이를 "경시"한다는 것입니다.

저는 이것을 알아내려고 몇 시간 동안 애를 썼습니다.제출 버튼(OnClientClick 기능 안에 있음)을 비활성화하기 위해 문을 제거하자 OnClick 메서드가 더 이상 문제 없이 호출되었습니다.

Microsoft에서 듣고 있다면 버튼을 클릭하면 이 작업을 수행하는 도중에 비활성화된 경우에도 할당된 작업을 완료할 수 있습니다.클릭할 때 비활성화되지 않는 한 할당된 모든 메서드를 완료해야 합니다.

버튼을 즉시 사용 안 함으로 설정하지 않고 setTimeout을 통해 지연하면 어떻게 됩니까?'사용 안 함' 기능이 반환되고 제출이 계속됩니다.

이 페이지에서 모든 것을 손상시킬 수 있는 다른 스크립트가 실행되지 않는 한 자바스크립트는 괜찮습니다.Firebug를 사용하여 확인할 수 있습니다.

이제 테스트를 좀 했는데 ASP.net 에서 비활성화된 제어를 무시하는 것 같습니다.기본적으로 포스트백이 발행되지만, 이 프레임워크는 비활성화된 버튼이 포스트백을 올릴 수 없다고 "추정"하기 때문에 이러한 이벤트를 무시할 수 있습니다.이건 제 개인적인 추론일 뿐입니다. Reflector를 이용해서 좀 더 자세히 확인할 수 있습니다.

해결책으로 나중에 비활성화를 시도해 볼 수 있습니다. 기본적으로 시간을 늦추는 것입니다.control.disabled = "disabled"JavaTimer 또는 다른 기능을 사용하여 호출합니다.이런 식으로 먼저 서버에 대한 포스트백은 자바스크립트 기능에 의해 컨트롤이 비활성화되기 전에 발행됩니다.할 수 .할다수는다수할n만k는tds'.

함수 업데이트클릭(btn) {

    for (i = 0; i < Page_Validators.length; i++) {

        ValidatorValidate(Page_Validators[i]);

        if (Page_Validators[i].isvalid == false)

            return false;
    }

    btn.disabled = 'false';

    btn.value = 'Please Wait...';

    return true;
}

언급URL : https://stackoverflow.com/questions/2155048/onclientclick-and-onclick-is-not-working-at-the-same-time

반응형