jquery не работи след извикване на ajax (отговор в изскачащ прозорец)

Имам jsp страница с формуляр и малко jquery код. Кодът на Jquery работи перфектно, но ако върна тази страница в изскачащ прозорец чрез извикване на ajax, кодът на jquery вече не работи.

Опитах се също да използвам делегиране, тоест:

  $('select[name=myElementName]').on("change", function() {
        // some code
});

  or

  $(document).on("change", 'select[name=myElementName]', function() {
        // some code
});

вместо

 $('select[name=myElementName]').change(function() {    
             // some code
    });

Обаждане на Ajax:

  var preview = function () {           
    $.ajax({
       type: "POST",
       url: myAction.do,
       data: "id=" + myid,
   success: function (response) {  
    // some code
    var x=window.open('', '_blank', 'titlebar=no,scrollbars=yes,menubar=no,height='+height+',width='+width+',resizable=yes,toolbar=no,location=no,location=0,status=no,left='+left+',top='+top+'');
    x.document.open();
    x.focus();
    x.document.write(response);

    return false;
    },
    error: function () {  
        return false;
    },
  });           
 }; 

РЕДАКТИРАНЕ

Във Firefox 26.0 и Chrome 32.0.x разреших с помощта на

 x.document.close();

след

x.document.write(replace);

Вместо това в IE всички включени .js скриптове се игнорират (например jquery-ui-1.9.1.js).

РЕДАКТИРАНЕ 2

Реших с

  <body onload="myload()">

и в моя jsp имам myload() дефиниция, в която извиквам скриптовете.


person Sefran2    schedule 15.01.2014    source източник
comment
възможен дубликат на Jquery функцията не работи след извикване на Ajax   -  person undefined    schedule 15.01.2014
comment
-Infinity без коментар.   -  person undefined    schedule 15.01.2014
comment
Не мога да разбера дали се опитвате да стартирате слушателя на събития .on('change'... на отворената страница или страницата, на която сте направили заявката. Моля, изяснете.   -  person Brian Noah    schedule 19.01.2014
comment
@Brian Noah на новата отворена страница   -  person Sefran2    schedule 20.01.2014


Отговори (5)


Това е така, защото създавате нова DOM структура, но тя няма прикачени манипулатори на събития. Най-лесният начин е да стартирате манипулатора на събития в обратното извикване на ajax:

$.ajax({

    ...
    success: function (response) {  
        // some code
        var x=window.open('', '_blank', 'titlebar=no,scrollbars=yes,menubar=no,height='+height+',width='+width+',resizable=yes,toolbar=no,location=no,location=0,status=no,left='+left+',top='+top+'');
        x.document.open();
        x.focus();
        x.document.write(response);

        // now, place the event handler here
        $('select[name=myElementName]', x.document.body).change(function() {    
                     // some code
        });
    }

}); 
person Tomas    schedule 17.01.2014
comment
но за външен .js? - person Sefran2; 18.01.2014
comment
@cricket какво имаш предвид външен .js? Може би трябва да илюстрирате по-подробно вашия пример във въпроса? - person Tomas; 18.01.2014
comment
@cricket, ако трябва да извикате някаква външна js функционалност, за да инсталирате манипулаторите, направете го в обратното извикване на ajax success. - person Tomas; 18.01.2014
comment
в този случай отговорът е цяла HTML страница. В тази страница включвам .js за инструмента за избор на дата. Firefox и Chrome го разпознават, но не и т.е. На т.е. трябваше да поставя другите скриптове във функция, наречена при зареждане на страница, но не знам какво да направя за включените. - person Sefran2; 19.01.2014
comment
@Cricket 1) след това отново извикайте тези скриптове от обратното извикване success. Това е, което трябва да направите. 2) Това, което съм написал в отговора, помага за кода, който демонстрирахте. Изглежда, че сега говорите за нещо друго. Освен ако не демонстрирате ясно какво правите и какъв е вашият проблем, никой всъщност няма да може да ви помогне с действителния ви проблем и наградата ви ще отиде на вятъра. - person Tomas; 19.01.2014

Не използвайте document.write, той напълно презаписва каквото и да е на страницата по време на писане и води до условия на състезание (напр. външните скриптове може вече да са били заредени, но може и да не са, което води до неизвестен ред на write и зареждания на скриптове ). Освен това вярвам, че documnt.write поставя сериализиран текст в документа, а не DOM обекти, така че може да не задейства събития.

Вместо това можете да отворите новия прозорец и след това да манипулирате DOM обектите там директно (ако приемем, че е на същия сървър като основната ви страница):

//Open a new window for the success info
var newWindow = window.open(newUrl);

//Now grab some element
var someItem = newWindow.document.getElementById( "someId");

//Manipulate dom either by "someItem.innerHTML" or "someItem.appendChild(...)"
person Don Rhummy    schedule 20.01.2014
comment
Не разбирам как да използвам document.onload на цял отговор на html страница, вместо document.write, и след това да го добавя към DOM. имате ли пример или линк за това? - person Sefran2; 21.01.2014
comment
@Cricket най-лесният начин е да поставите код в страницата, която зареждате в рамката (това трябва да живее на същия сървър като външната страница), който казва на външната страница, че е заредена. iframe би направил това чрез извикване на функция на javascript в родителя: parent.iframeLoaded();. В iframeLoaded бихте добавили елементи или променили съществуващите елементи на iframe wither с обикновен javascript или jQuery по този начин: $("#myiframe").contents().append( "<p>Test</p>" );. - person Don Rhummy; 21.01.2014
comment
Не използвам (и не бих) използвал iframe. Имам ajax извикване на java действие, което връща html страница (по принцип това е формуляр за предварителен преглед с някакъв код на заявка и включване на някои външни .js). Всичко работи, но в IE външните .js се игнорират. - person Sefran2; 21.01.2014
comment
@Cricket Това го прави по-лесно! (Съжалявам за iFrame, разбрах погрешно какво правите). Отново, стойте далеч от document.write и вместо това направете това, което показах по-горе (редактирах отговора си) - person Don Rhummy; 21.01.2014

Ако извиквате рутинна програма на AJAX сървър и поставяте целия отговор без обработка на клиента в нов прозорец, защо не отворите прозореца директно с URL адреса на тази рутинна AJAX и пропуснете всички неща:

....
var x=window.open(myAction.do + "?id=" + myid, 
 '_blank', 
 'titlebar=no,scrollbars=yes,menubar=no,height='+height+',width='+width+',resizable=yes,toolbar=no,location=no,location=0,status=no,left='+left+',top='+top+'');
....

Единствената разлика тук е, че заявката е GET, а не POST заявка, но данните са само един идентификатор, което вероятно е приемливо?

person Axel Amthor    schedule 24.01.2014
comment
Извиквам ajax от jquery плъгин, който получава url от jsp. Не мога да отворя директно прозореца - person Sefran2; 24.01.2014
comment
ако можете да предадете url на AJAX Call, можете да го предадете и на всяка друга функция на javascript. - person Axel Amthor; 25.01.2014

Имах подобен проблем в един от моите проекти. Реших го, като написах метод за успех след извикването на ajax.

            {
             $.ajax({
              type: "POST",
              url: "/abc/",
              data:{<data>},
              async:false,
              dataType:'json',
              success: function(response)                   
              {
                success=1;
                Id=response;
                  return;
              }
        });
        if (success)
        {
                #your code here
                var a='/xyz/?Id='+Id
                window.open(a,'_blank');
                window.location.href='/bg/registration/'
        }
        return false;}
person Abhimanyu Bhosale    schedule 21.01.2014

вместо да използвате document.write, опитайте да извлечете вашите данни за успех (записи, пристигнали във функция за успех) в скрит DIV и да го клонирате във вашия изскачащ прозорец, който трябва да работи

person Makrand    schedule 21.01.2014