2009-06-04 6 views
7

JQuery에서 질문이 있습니다. 난 $.ajax() 내 코드 (Function 1)$_POST['name']$_POST['sequenceno']에 의해 해당 데이터를 가져오고 sequence no 주어진 주어진 .. 필드 이름을 업데이트하는 ctrller 수 fieldname 및 시퀀스 번호를 보내려면 사용 삽입 된 필드가있는 미리보기 디스플레이 패널을 생성합니다. 이제 필드 이름을 다시 변경하려고합니다. 생성 된 디스플레이 패널 필드를 클릭하면 해당 설정이 열리고 이름을 변경하려고 시도합니다. 지금 필드 (Function 2)동일한 아약스가 두 번 호출됩니다 .JQuery

Function1Function2 모두 동일합니다. Function1에서 필드 이름과 시퀀스를 보내지 않습니다.

Funciton 2에서 동일한 필드 이름을 보내려하지만 (다른 값) sequenceno ..

하지만 Function1 (sequenceno는 카운터 값입니다.) Function2 (sequenceno는 클릭 된 div id (패널 표시) 임)에 비해

동일한 func을 어떻게 사용할 수 있습니까? 둘 다 .. 아니면 내가 sep를 사용할 수 있을까? arz funcs ..

다른 URL을 가진 2 개의 개별 기능을 시도했지만 올바르게 업데이트되지 않았습니다.

내 코드는

입니다.
 //This is what i insert the field initially 

       $(".TextFieldSettings #fieldTitle").change(function(){ 
      fieldname=$(".TextFieldSettings #fieldTitle").val(); 
    $.ajax({ 
      type: "POST", 
      url: "./server", 
     data: "name="+fieldname+"&sequenceno="+counter, 

       success: function(msg){ 
         }//success 
      });//ajax 

    });//change 

//After inserting to get the updated values in JSON format 

    var htm = $.ajax({ 
     type: "GET", 
      url: "./viewforms", 
     async: false 
     }).responseText; 
     var myObject = eval('(' + htm + ')'); 


    gettype=myObject.attributes[0]["type"]; 
    getlabel=myObject.attributes[0]["labels"]; 

    //showing in my DisplayPanel view 

      $("#labelstr"+counter+"").html(getlabel); 
    });//change 

이제 DisplayPanel보기를 클릭하면

  $("#displayPanel div").live("click", function(){ 
          div_id=$(this).attr("id"); 

           var htm = $.ajax({ 
            type: "GET", 
            url: "./getattributes/"+div_id+"", 
            async: false 
           }).responseText; 
           var myObject = eval('(' + htm + ')'); 


           gettype=myObject.attributes[0]["type"]; 
           getlabel=myObject.attributes[0]["labels"]; 
           getsize=myObject.attributes[0]["size"]; 

    if(gettype=='Text') 
    { 
    $(".TextFieldSettings").show(function(){ 
    $(".TextFieldSettings #fieldTitle").val(getlabel);//showing the updated value 
          if(getsize=='100') 
          { 
      $("#fieldSize option:contains(Small)").attr("selected",true); 
          } 
          else if(getsize=='200') 
          { 
     $("#fieldSize option:contains(Medium)").attr("selected",true); 
         } 
       else 
      { 
      $("#fieldSize option:contains(Large)").attr("selected",true); 
      } 
//Again i m changing the fieldname 


     $(".TextFieldSettings #fieldTitle").change(function(){ 
     fieldname=$(".TextFieldSettings #fieldTitle").val(); 


           alert(div_id); 
             $.ajax({ 
              type: "POST", 
              url: "./editsettings", 



                     data: "name="+fieldname+"&sequenceno="+div_id, 
              success: function(msg){ 

              }//success 
              });//ajax 


});//change in text value later*/ 



        });//show 
        }//if type = TEXT 

       });//displaypanel Div clicked 

하지만 지금은 fieldname을 다시 변경하려고하면 다른 POST 함수 editsettings을 작성하고 있지만 실행은 Func2 (필드 이름을 다시 변경) 대신 Func1 (처음에는 변경) 내부에서 발생합니다 ... 누구나 답을 얻으십시오 이 .... 참고 : $(".TextFieldSettings #fieldTitle").change() 내 PRG .. 두 번 사용됩니다. 때문에이 updation 잘못된 것일 수 있습니다.

+1

실제로 어떤 부분이 여기에 질문입니까? 당신은 단지 하나의 재사용 가능한 기능과 두 가지 다른 기능을 가질 수 있는지 알고 싶습니까? – Fenton

+0

두 개의 다른 function() 그러나 두 이름은 모두 $ (". TextFieldSettings #fieldTitle")과 같습니다. change (function() {}); 동일한 목적이지만 다른 목적 – useranon

답변

8

두 이벤트 핸들러가 모두 실행되고 후자 만 실행되는 것이 문제 인 것 같습니다.

jQuery .change() 함수 은 변경 이벤트에 이벤트 핸들러를 추가합니다. 그것은 기존의 것을 대체하지 않습니다. 이전 핸들러를 제거하려면 다음과 같이해야합니다. 새 핸들러를 연결하기 전에

$(".TextFieldSettings #fieldTitle").unbind('change') 

을 입력해야합니다.

이 작동하는지 (단지 API 문서에서 찾았 음) 잘 모르며 지금 당장은 테스트 할 수 없습니다. 그러나 일반적인 생각은 이벤트 처리기가 이벤트에 응답하지 않게하려면 처리기를 제거해야한다는 것입니다.

+0

안녕하세요, 두 번째 변경 전에 코드에서 바인딩 해제 된 것을 사용했습니다 ... 이제 두 번째 변경을 사용하면 작업 ...하지만 첫 번째 변경을 사용하려고 할 때 이제 두 번째 변경이 뒤 따르는 첫 번째 변경 사항이 호출됩니다 ...하지만 내 첫 번째 호출 만 필요합니다 ... 실제로 첫 번째 변경 기능은 처음에 필드를 만드는 것입니다. 두 번째 변경 사항은 필드가 이미 생성되었습니다. 현재 시도 중 ... 어떤 필드의 필드 설정을 편집 한 후 ... 새 필드를 만들 수 있습니다 (즉, 새 필드를 만들 수 있습니다). – useranon

+1

당신이해야 할 일은 변경 핸들러를 하나의 함수로 만들고 그 함수에서 조건에 따라 취할 조치를 결정하는 것입니다. 그렇게하면 아무 것도 바인딩 해제 할 필요가 없습니다. – Rytmis

5

동일한 스크립트를 두 번 포함하지 않겠습니까?

Viewstart :

Scripts/jquery-1.6.1.js 

부분보기 : 예를 들어

<script src="@Url.Content("~/Scripts/jquery-1.6.1.min.js")" type="text/javascript"></script> 

나는 동일한 문제가 있고 난 최소 버전을 삭제하여 그것을 해결.

도움이되기를 바랍니다.

2

다른 경우가 있습니다. 바인드 버튼을 클릭하면 포스트 아약스를 두 번 보내 게됩니다. 그것은 동일한 이름을 가진 두 개의 ID를 가지고 있기 때문에 트리거가 두 번 감지되었습니다.

+0

이것은 실제 답변이 아닐 수도 있지만 저에게 도움이되었습니다. :) – darwindeeds

0

아마존 웹 서비스 EC2를 사용하는 프로젝트를 진행 중입니다. 큰 파일 (최대 150MB)을 업로드하고 있습니다. 프런트 엔드에서 Ajax를 사용하십시오. 그리고 백엔드에서 스프링 MVC. 내 문제는 두 번 호출 된 스프링 컨트롤러 "uploadFile()"입니다. 내 자바 스크립트에서 중단 점을 설정, javacript 메서드는 두 번 호출하지 않습니다. 이는 AWS 인스턴스에서만 발생하며 내 지역에서는 발생하지 않습니다. 그리고 그것은 uploadFile() 메소드 호출 사이에서 약 90 초입니다. 그러면 ajax 콜백에 오류가 발생합니다. 상태 코드 = 0, 오류 = "이 두 번 어떤 곳 아약스 호출 백엔드 수도 있지만 순 :: ERR_EMPTY_RESPONSE"

I "를 나에게 제공 크롬 검사"중단 "는 파이어 폭스 파이어 버그는 말한다."

많은 솔루션을 stackoverflow에서 검색합니다. like
1./추가 e.preventDefault() 및 e.stopImmediatePropagation(); 2 ./ 또는 tomcat/confg/server.xml의 maxSwallowSize를 변경하십시오. 3. $ ("# uploadFileForm") unbind ('submit') submit (function (e) 4. async를 true로 변경하고 시간 초과 값을 추가하십시오 'POST', 시간 제한 : 60000, 비동기 : 아약스 방법 입력합니다. 사실, 위의 작업

없음

마침내 나는 600 초 ELB의 변화 유휴 시간 초과하여 한가 지 그리고 내 컨트롤러. 두 번 호출되지 않습니다.

http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html https://aws.amazon.com/blogs/aws/elb-idle-timeout-control/

먼저 많은 도움을주는 stackoverflow에서 질문에 대답하는 모든 사람들에게 감사 드리고 싶습니다. 해결책은 잘못이 아니라 내 경우가 아닙니다. 그리고이 문제는 3 일이 걸립니다. 질문에 도움이되기를 바랍니다. "ajax fire/call twice" "스프링 컨트롤러 호출 두 번" "Ajax timeout"

관련 문제