2013-05-24 3 views
0

Я пытаюсь проксировать функцию, чтобы просто заменить часть страницы вместо перезагрузки всей страницы.Ajax post обработки возвращенных данных

<div id="content" style="display:none;"> 
</div> 
<div class='contentitem' id='restart' style="margin-top: 100px; margin-left: 100px; margin-bottom: 100px; display:block;"> 
    <table> 
     <tr> 
      <td></td> 
      <td><p style="font-size: 1.2em; font-weight: bold;"><%=translate([==[Loading...]==])%></p></td> 
     </tr> 
    </table> 
</div> 

<script type="text/javascript"> 
//jquery library 
// released under BSD license 
</script> 

<script type="text/javascript" src="/jquery-1.9.1.min.js"></script> 

<script type="text/javascript"> 
    var content = $("#content"); 

    $(document).ready(function(){ 
     content.load('/cgi/b/sfltr/cfg/ div .contentitem', function(content) { 
     $(this).find('tbody').each(function(){ 
       $("span:contains('Content Based Filtering')").closest("table").remove(); 
      }); 
     document.getElementById("restart").style.display = "none"; 
     document.getElementById("content").style.display = "block"; 
     //alert('Load was performed.'); 
    }); 
    }); 

    //intelligent version of submitform: will only refresh what is needed: 
    (function() { 
    // proxying... 
    var proxied = submitForm; // keep a copy of original method 
    submitForm = function(theForm, actionNo, flags, primkey, confirmMsg, anchor, eval_code, customP) { 
    //potential issue with the switch language... I think actionNo = 0 means reload. 
    //alert('gotcha'); 
    // the following code is identical to what is in util.js 
    //customP is only for restore page to upload config file to GW 
    var VALIDATE = 0x01; 
    var CONFIRM = 0x02; 
    var EVAL  = 0x04; 

    if (flags && (flags & VALIDATE)) 
     if (!validate(theForm, actionNo)) return false; 
    if (flags && (flags & CONFIRM)) 
     if (!confirm(confirmMsg)) return false; 
    if (flags && (flags & EVAL) && eval_code) 
     eval(eval_code); 
    if (actionNo > 0) 
     theForm.elements[0].value = actionNo; 
    if (primkey) 
     theForm.elements[1].value = primkey; 
    var customArgs = new String(""); 
    if (g_state[TYPE].length > 0) 
    { 
     customArgs += "name="+encodeURIComponent(g_state[NAME]); 
     if (g_state[KEY].length > 0) 
     customArgs += "&" + g_urlArgs[KEY] + "=" + encodeURIComponent(g_state[KEY]); 
    } 
    if (g_state[TID].length > 0) 
    { 
     if (customArgs != "") 
     customArgs += "&"; 
     customArgs += g_urlArgs[TID] + "=" + encodeURIComponent(g_state[TID]); 
    } 
    theForm.action += constructArgString(customArgs); 
    if (customP) 
     theForm.action += "&" + customP; 
    if (anchor) 
     theForm.action += "#" + anchor; 
    //end of copy paste... 


    //theForm.submit(); 
    //disable_fields(theForm); 
     document.getElementById("restart").style.display = "block"; 
     document.getElementById("content").style.display = "none"; 

    //Now, I change the submit 
    //theForm.submit(function() { 

     $.ajax({ 
      type: $(theForm).attr('method'), 
      url: $(theForm).attr('action'), 
      data: $(theForm).serialize(), 
      datatype: "html" 
      }) 
     .done(function (html) { 
      //alert(html); 
      var Test = -1; 
      $("html").find('p').each(function(){ 
      //var result = $("this").find(":contains('You are being redirected')"); //check if tries to redirect 
      Test = Test?Test:this.indexOf("You are being redirected"); //if we already found we skip. 
      //TBD portuguese variant... 
      alert(this); 
      alert(Test); 
      }); 
      if (Test==-1) { 
       content.html(html); 
      content.find('table').each(function(){ 
       $("span:contains('Content Based Filtering')").closest("table").remove(); 
       // Filtragem com base em conteúdo 
       $("span:contains('Filtragem com base em conte')").closest("table").remove(); 
       $(document).find("#restart").css("display","none"); 
       content.css("display", "block"); 
      }); 
      } 
      else 
      { 
      GoAndRemember('/PC_ov.lp', ''); 
      } 
      }) 
     .fail(function (xhr, textStatus, errorThrown) { 
     alert('Unknown error:'+xhr.responseText); 
     window.location.reload(); 
     }); 
    } 
    return false; 
    })(); 

</script> 

Когда я отправить форму с помощью функции, почтовые работы, а 200OK содержит страницы, я хочу, чтобы разобрать.

То, что я не понимаю:

  1. Почему я начинаю загрузку встроенного сценария после того, как (скрипт кода, встроенного в 200OK), => Возможно, это потому, что я поставил это внутри DIV прежде чем я отфильтрую его, но я думал, что это единственный способ сделать это. Должен ли я создать новый объект XHR для его хранения, а затем отфильтровать этот объект и установить DIV с результатом .html()? Если да, то может кто-нибудь дать небольшой пример?
  2. почему я в конечном итоге с ошибкой, потому что он переписывает JavaScript Я использую (он должен быть точно такой же код в любом случае)

Благодаря

ответ

0

Я нашел ответ здесь. Похоже, что при использовании типа данных «html» он всегда будет выполнять встроенные js. Это решило проблему: prevent jquery ajax to execute javascript from script or html response

Ошибка в том, что некоторые элементы, необходимые для работы встроенного JS, недоступны в этом контексте.

В любом случае, спасибо.

Смежные вопросы