2013-10-25 3 views
0

im пытается создать скрипт, который изменяет строки P на поля ввода, позволяет пользователю редактировать их, а затем возвращать обратно в p строк после проверки внешнего документа php через ajax. Однако проблема заключается в том, что я не могу использовать это в части ajax, это нарушает код. Как я могу это решить? Мне нужно разместить HTML-код?Получение этого результата ajax

$(document).ready(function() { 

    function changeshit(result, that) { 
     if (result == "success") { 

      $(that).closest('div').find('input').each(function() { 


       var el_naam = $(that).attr("name"); 
       var el_id = $(that).attr("id"); 
       var el_content = $(that).attr("value"); 

       $(that).replaceWith("<p name='" + el_naam + "' id='" + el_id + "'>" + el_content + "</p>"); 

      }); 


      $(".editlink").replaceWith("<a href=\"#_\" class=\"editlink\" name=\"edit\" id=\"" + editid + "\">Bewerken</a>"); 
     } else { 

      alert(result); 
     } 
    } 



    $(".editinv").on('click', 'a', function() { 

     var editid = $(this).attr("id"); 
     var edit_or_text = $(this).attr("name"); 

     if (edit_or_text == "edit") { 


      $(this).closest('div').find('p').each(function() { 

       var el_naam = $(this).attr("name"); 
       var el_id = $(this).attr("id"); 
       var el_content = $(this).text(); 

       $(this).replaceWith("<input type='text' name='" + el_naam + "' id='" + el_id + "' value='" + el_content + "' />"); 

      }); 


      $(".editlink").replaceWith("<a href=\"#_\" class=\"editlink\" name=\"done\" id=\"" + editid + "\">Klaar</a>"); 

     } else if (edit_or_text == "done") { 


      var poststring = ""; 
      $(this).closest('div').find('input').each(function() { 

       var el_naam = $(this).attr("name"); 
       var el_id = $(this).attr("id"); 
       var el_content = $(this).attr("value"); 

       poststring = poststring + '' + el_naam + '=' + el_content + '&'; 

      }); 

      poststring = poststring + 'end=end' 

      $.ajax({ 
       url: 'http://' + document.domain + '/klanten/updateaddress.php', 
       type: 'post', 
       data: poststring, 
       success: function (result, this) { 

        changeshit(result, this); 


       } 
      }); 
     } 

    }); 
}); 
+0

'changeshit' ожидает два параметра, вы только поставляете их. – Barmar

+0

забыл изменить это в моем вставленном коде, он не работает с этим там. Добавляем этот код. Без него он правильно находит результат. – Snuur

+0

Что именно вы пытаетесь получить через 'this' в ответе AJAX? –

ответ

1

Да, общие решения является объявить пример вар себя = это и использование, которое переменная

var self = this; 
$.ajax({ 
      url: 'http://'+document.domain+'/klanten/updateaddress.php', 
      type: 'post', 
      data: poststring, 
      success: function(result) { 

      changeshit(result, self); 


      } 
     }); 
    } 

Таким образом, этот контекст сохраняется в переменной.

+0

Это сработало для меня, спасибо! – Snuur

1

Попробуйте следующее:

Прямо под $(".editinv").on('click', 'a', function() { добавить

$(".editinv").on('click', 'a', function() { 
    var element = this; 

А затем изменить это:

$.ajax({ 
    url: 'http://' + document.domain + '/klanten/updateaddress.php', 
    type: 'post', 
    data: poststring, 
    success: function (result) { 
     changeshit(result, element); 
    } 
}); 

То есть, если я понять правильно, что вы пытаетесь

1

Если вы просто добавить:

context: this 

к $.ajax опций, то success обработчик будет автоматически вызываться с правильным значением this, так что вам не нужен параметр that.

Вы тогда тоже больше не нужны дополнительные функции обертки вокруг success обратного вызова, так что вы можете просто использовать:

$.ajax({ 
    url: 'http://' + document.domain + '/klanten/updateaddress.php', 
    type: 'post', 
    data: poststring, 
    context: this,  // propagate "this" 
    success: changeshit // just pass the func ref 
}); 
1

Есть несколько способов, вы можете достичь этого

1) Если вы читаете документацию (jQuery.ajax) вы увидите, что вы можете поставить контекст метода АЯКС

контекста Тип: PlainObject Этот объект будет создан в контексте всех обратных вызовов, связанных с Ajax. По умолчанию контекст представляет собой объект, который представляет параметры ajax, используемые в вызове ($ .ajaxSettings, объединенный с настройками, переданными в $ .ajax).

$.ajax({ 
    url: 'http://'+document.domain+'/klanten/updateaddress.php', 
    type: 'post', 
    data: poststring, 
    context: this, 
    success: function(result) { 
     // the context sent above would become the context of this function when called by jquery 
     changeshit(result, this); 
    } 
}); 

Используя это таким образом, вы даже можете сделать это как сильфона код

function changeshit (result) { 
    var $that = $(this); 
    if (result == "success") { 

      $that.closest('div')... // cool ha ? 
}; 
$.ajax({ 
    url: 'http://'+document.domain+'/klanten/updateaddress.php', 
    type: 'post', 
    data: poststring, 
    context: this, 
    success: changeshit 
}); 

2) Вы можете воспользоваться затворов (read more here или поиск Google), так что ваш код будет становиться

var context = this; 
$.ajax({ 
    url: 'http://'+document.domain+'/klanten/updateaddress.php', 
    type: 'post', 
    data: poststring, 
    success: function(result) { 
     // here you can use any variable you declared before the call 
     changeshit(result, context); 
    } 
}); 

В качестве побочного примечания я бы порекомендовал вам использовать кеширование переменной/объекта, поэтому объявите var $this = $(this) в верхней части функции и используйте ее, чтобы она использовала вашу функцию вместо вызова $(this) каждый раз, когда вам это нужно.

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