2009-10-15 41 views
23

Tôi có cuộc gọi ajax này với số doop.php.Phạm vi thành công của Ajax jquery

function doop(){ 
     var old = $(this).siblings('.old').html(); 
     var new = $(this).siblings('.new').val(); 

     $.ajax({ 
      url: 'doop.php', 
      type: 'POST', 
      data: 'before=' + old + '&after=' + new, 
      success: function(resp) { 
       if(resp == 1) { 
        $(this).siblings('.old').html(new); 
       } 
      } 
     }); 

     return false; 
    } 

Vấn đề của tôi là đường dây $(this).siblings('.old').html(new); không hoạt động.

cảm ơn .. tất cả nhận xét/câu trả lời hữu ích đều được bỏ phiếu.

Cập nhật: có vẻ như một nửa vấn đề là phạm vi (cảm ơn câu trả lời đã giúp tôi làm rõ điều đó), nhưng một nửa khác là tôi đang cố gắng sử dụng ajax theo cách đồng bộ. Tôi đã tạo một bài đăng mới

+8

Whoa whoa whoa whoa whoa. 'new' là một từ dành riêng: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Reserved_Words –

+3

Đừng lo lắng về cái mới, nó được gọi là cái gì đó khác trong mã của tôi. Chỉ cần gọi nó mới để làm cho mã dễ hiểu hơn cho các bạn – Chris

Trả lời

24

Trước hết là newa reserved word. Bạn cần phải đổi tên biến đó.

Để trả lời câu hỏi của bạn, Vâng, bạn cần phải lưu this trong một biến bên ngoài gọi lại thành công, và tham khảo nó bên trong mã xử lý thành công của bạn:

var that = this; 
$.ajax({ 
    // ... 
    success: function(resp) { 
     if(resp == 1) { 
      $(that).siblings('.old').html($new); 
     } 
    } 
}) 

này được gọi là closure.

+0

Hmm, lạ, tôi đã thử một cái gì đó rất giống với những gì bạn đã làm, nhưng tôi đã làm 'var saveit = $ (this);' không hoạt động. Tôi sẽ cố gắng này ngay bây giờ .. Cũng đừng lo lắng về mới, nó được gọi là cái gì khác trong mã của tôi. – Chris

+0

@Chris: re: 'new', tôi đã tìm được càng nhiều. :) –

+0

@Chris: việc đóng lại không hoạt động, hãy đảm bảo 'doop' chính là tham chiếu đến' this' được mong đợi. Nếu bạn chỉ cần gọi 'doop()', ví dụ 'this' sẽ chỉ trỏ đến đối tượng' window'. –

5

this được ràng buộc với đối tượng mà chức năng thực thi đã được áp dụng. Đó có thể là một số AJAX đối tượng phản ứng, hoặc đối tượng toàn cầu (window), hay cái gì khác (tùy thuộc vào việc thực hiện các $.ajax.

Tôi có cần phải chụp $ (this) vào một biến trước khi vào $. ajax gọi, và sau đó vượt qua nó như là một tham số để gọi $ .ajax? hoặc tôi cần phải vượt qua nó để chức năng thành công vô danh? Nếu đó là sẽ giải quyết vấn đề, nơi nào tôi vượt qua nó để $ .ajax?

Bạn thực sự cần một cách để nắm bắt giá trị this trước khi xác định chức năng success. Việc tạo bao đóng là cách để thực hiện việc này.Bạn cần phải efine biến riêng biệt (ví dụ: self):

function doop() { 
    var old = $(this).siblings('.old').html(); 
    var new = $(this).siblings('.new').val(); 

    var self = this; 

    $.ajax({ 
     url: 'doop.php', 
     type: 'POST', 
     data: 'before=' + old + '&after=' + new, 
     success: function(resp) { 
      if(resp == 1) { 
       $(self).siblings('.old').html(new); 
      } 
     } 
    }); 

    return false; 
} 

Chức năng success sẽ giữ lại giá trị của self khi gọi, và nên cư xử như bạn mong đợi.

+0

Cảm ơn +1. Điều này cũng giống như câu trả lời của crescentfresh và nó giải quyết "một phần của vấn đề" .. sẽ cập nhật các câu hỏi với xử lý sự cố hơn. – Chris

46

Bạn nên sử dụng bối cảnh thiết lập như trong http://api.jquery.com/jQuery.ajax/

function doop(){ 
    var old = $(this).siblings('.old').html(); 
    var newValue = $(this).siblings('.new').val(); 

    $.ajax({ 
     url: 'doop.php', 
     type: 'POST', 
     context: this, 
     data: 'before=' + old + '&after=' + newValue, 
     success: function(resp) { 
      if(resp == 1) { 
       $(this).siblings('.old').html(newValue); 
      } 
     } 
    }); 

    return false; 
} 

"này" sẽ được chuyển đến phạm vi thành công và sẽ hoạt động như mong đợi.

+0

Bạn thực sự không nên sử dụng các từ dành riêng như 'new' làm tên biến. – Tomalak

+5

+1 Đây phải là câu trả lời được chấp nhận. – Nick

+0

Đồng ý với Nick - đây là cách tiếp cận chính xác. Hãy xem xét rằng phương pháp "lưu nó trong biến khác" sẽ không hoạt động nếu bạn có chức năng "doop" được gọi khi một trong nhiều nút được nhấp hoặc một số trùng lặp khác. –

Các vấn đề liên quan