2012-01-28 28 views
10

Vấn đề về giao dịch thực sự đối với tôi, bởi vì tôi không có đầu mối để giải quyết nó.jQuery bật ("dán") lần đầu tiên không lấy hoặc vượt qua giá trị

Kịch bản lệnh jQuery Tôi đã viết nên lấy giá trị đầu vào trên hành động "dán" và chuyển nó qua ajax tới trình điều khiển mã vạch.

Nó thực sự hoạt động tốt, nhưng chỉ khi tôi dán giá trị cho lần thứ hai (và tiếp theo). Nó cũng hoạt động tốt khi tôi thay đổi ("dán") thành ("click") đối với một số div hoặc phần tử DOM khác.

Script:

<script type="text/javascript"> 
$("#link").on("paste", function(){ 
$("#thumbs").empty().html("<p>loading</p>"); 
var postData = { 
    'url' : $("#link").val() 
}; 

$.ajax({ 
    type: "POST", 
    url: "/thumb/ajax/", 
    data: postData , //assign the var here 
    success: function(msg){ 
    $("#thumbs").html("Data Saved: " + msg); 
    } 

}); 

});

Bất kỳ trợ giúp sẽ được đánh giá

EDIT: một gợi ý nhiều hơn nữa.

val() trong tập lệnh cụ thể này thực sự có giá trị trước hành động dán. Nếu tôi viết một cái gì đó cho đầu vào này, sau đó loại bỏ nó và dán cái gì khác nó sẽ thực sự vượt qua để điều khiển giá trị tôi đã viết, không phải là một trong tôi dán.

EDIT2: OK, tôi chắc chắn đó là vấn đề với jQuery khi dán.

<script type="text/javascript"> 

    $("#link").on("paste", function(){ 
     $("#thumbs").empty().html("<p>loading</p>"); 
     var postData = {'url' : $("#link").val() }; 
     $("#thumbs").html($("#link").val()); 
    }); 


</script> 

Tập lệnh này sẽ thêm giá trị từ đầu vào vào div # thumbs. Nó không cho hành động dán đầu tiên. Thứ hai nó thực sự hoạt động.

EDIT3: Bạn tôi đã gợi ý cho tôi. trên ("dán") hoạt động ngay trên hành động "dán" và trước khi dán thực sự được thực hiện. Nếu bất cứ ai cho tôi một gợi ý làm thế nào để làm cho một thời gian chờ để lấy giá trị sau khi dán tôi có thể di chuyển trên.

Trả lời

21

Sự cố được giải quyết.

Như tôi đã nói, "on (" paste ")" hành động đang được thực hiện ngay trên dán thực tế. Vì vậy, chức năng đang được thực hiện trước khi giá trị được dán vào đầu vào. Đó là bởi vì thời gian dán đầu tiên lấy và vượt qua giá trị mặc định của đầu vào (null cho ví dụ của tôi).

Giải pháp là đặt thời gian chờ. Mã bên phải trông giống như vậy và hoạt động tốt.

$("#link").on("paste", function(){ 

setTimeout(function() { 
    $("#thumbs").html("<p>loading</p>"); 
    var postData = { 
     'url' : $("#link").val() 
     }; 
    $.ajax({ 
     type: "POST", 
     url: "/thumb/ajax/", 
     data: postData , //assign the var here 
     success: function(msg){ 
     $("#thumbs").html("Data Saved: " + msg); 
      $(".thumb").click(function(){ 
      (this).attr('id'); 


     }); 

     } 

    }); 
}, 500); 

});

Sự cố được giải quyết, nhờ @ 3nigma hỗ trợ.

+1

Tôi ước gì tôi đã xem bài đăng này một giờ trước. Jquery tôi có thể có giờ đó trở lại cuộc sống của tôi, bạn chỉ lãng phí ^^ – azzy81

+1

Bạn sẽ có thể thực hiện việc này với thời gian chờ được đặt là 0. –

1

nó hoạt động tốt ở đây

DEMO

update:

bạn sẽ phải stringify đối tượng để gửi nó đến máy chủ, bao gồm json2.js mã của bạn sẽ trông giống như

$("#link").on("paste", function(){ 
$("#thumbs").empty().html("<p>loading</p>"); 
var postData = { 'url' : $("#link").val(), 'test' : 'testtest' }; 

    $.ajax({ 
     type: "POST", 
     url: "your/url", 
     data:JSON.stringify(postData), 
     success: function(msg){ 
     $("#thumbs").html("Data Saved: " ); 
     }   
     }); 
     }); 

đây là DEMO tôi đã bao gồm json2.js fr om số cdn

+0

tôi đã sâu hơn và thêm một đối tượng để POSTDATA mà bây giờ trông như thế này: var POSTDATA = { 'url':. $ ("# Liên kết") val(), 'test': 'testtest' } ; Khi dán đầu tiên chỉ 'kiểm tra' được chuyển tới bộ điều khiển, [url] trống. Không biết vấn đề là gì. – sznowicki

+0

@sznowicki xem nội dung cập nhật câu trả lời – Rafay

+0

Tại sao tôi nên làm điều đó? Nếu tôi thay đổi ("dán") thành bật ("click") nó hoạt động tốt mọi lúc. Nó truyền giá trị đầu vào cho bộ điều khiển đúng cách. Đúng nếu tôi sai. – sznowicki

1

Tôi đã kết thúc bằng cách sử dụng 'oninput', hoạt động tốt trừ khi bạn cần hỗ trợ IE8 trở xuống.

+0

Nó làm việc cho tôi Cảm ơn @Roger –

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