Один и тот же Ajax вызывается дважды .. JQuery - PullRequest
8 голосов
/ 04 июня 2009

У меня вопрос в JQuery. Я использую $.ajax() в своем коде (Function 1), чтобы отправить имя поля и порядковый номер к ctrller, который получает свои данные по $_POST['name'] и $_POST['sequenceno'] и обновляет имя поля в таблице с заданной последовательностью. И генерирует панель отображения предварительного просмотра со вставленными полями. Теперь я пытаюсь изменить имя поля снова. Теперь, когда я нажимаю на сгенерированные поля панели дисплея, откроются соответствующие настройки, и я попытаюсь изменить имя поля сейчас (Function 2)

И Function1, и Function2 одинаковы. В Function1 отправляю имя поля и последовательность №

В Funciton 2 я хочу отправить то же имя поля и (но другое значение) sequenceno ..

Но в Function1 (sequenceno - значение счетчика) Принимая во внимание, что в Function2 (sequenceno - идентификатор div, по которому щелкнули (панель отображения))

Как я могу использовать один и тот же функционал для обоих .. Или мне может понадобиться использовать отдельные функции ..

Даже я пытался с 2-мя отдельными функциями с разными URL, но не обновляется правильно

Мой код

    //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

Но теперь, если я снова пытаюсь изменить имя поля, я пишу другую функцию POST editsettings, но выполнение происходит внутри Func1 (изменяется изначально) вместо Func2 (снова меняется в имени поля) ... Пожалуйста, кто-нибудь получить ответ за это .... Замечания: $(".TextFieldSettings #fieldTitle").change() используется дважды внутри моего prg .. Может быть из-за этого обновление идет не так

Ответы [ 4 ]

8 голосов
/ 04 июня 2009

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

Функция jQuery .change () добавляет обработчик события к событию изменения. Он не заменяет существующие. Если вы хотите удалить предыдущий обработчик, вам нужно что-то вроде:

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

перед тем, как присоединить новый обработчик.

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

5 голосов
/ 27 июня 2011

Вы уверены, что не включаете один и тот же скрипт дважды? Например:

Viewstart:

Scripts/jquery-1.6.1.js

Частичный вид:

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

У меня возникла та же проблема, и я решил ее, удалив min-версию.

Надеюсь, это поможет.

2 голосов
/ 17 апреля 2012

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

0 голосов
/ 15 сентября 2016

Я работаю над проектом, который использует Amazon веб-сервис EC2. Я загружаю большой файл (до 150 МБ). Используйте Ajax на переднем конце. И весной MVC на бэкэнде. Моя проблема заключается в том, что Spring-контроллер "uploadFile ()" вызывается дважды. Я установил точку останова в моем javascript, метод javacript не вызывается дважды. Это происходит только на экземпляре AWS, а не на моем локальном компьютере. И это около 90 секунд между вызовом метода uploadFile (). Тогда обратный вызов ajax получит ошибку. Код состояния = 0, ошибка = "" Firefox Firebug говорит "прервано" Chrome Inspect дает мне "net :: ERR_EMPTY_RESPONSE"

Я думаю, что это может быть где-то, где ajax вызывает backend дважды.

Я ищу много решений на stackoverflow. как
1. / добавить e.preventDefault () и e.stopImmediatePropagation (); 2 ./ или изменить maxSwallowSize в tomcat / confg / server.xml 3. $ ("# uploadFileForm"). Unbind ('submit'). Submit (function (e) 4. измените async на true и добавьте значение времени ожидания к методу ajax тип: 'POST', тайм-аут: 60000, async: true,

Ничего из вышеперечисленного не работает.

Наконец, я решаю это путем изменения времени ожидания в ELB на 600 секунд. И мой контроллер не звонил дважды.

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 дважды" "вызов контроллера Spring дважды" "Тайм-аут Ajax"

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