2013-04-02 45 views
9

Cố gắng chuyển đối tượng jQuery đến thuộc tính dataTransfer trong một chuỗi kéo/thả. Sau khi thêm thuộc tính vào jQuert.event.props mảng tôi có thể gán nó, nhưng nó trả về không xác định trong sự kiện drop. Không chắc chắn những gì tôi đang thiếu ở đây - có vẻ thực sự đơn giản.Phần tử vượt qua jQuery tới thuộc tính dataTransfer

Javascript:

function dragClip(clip, event){ 

    event.dataTransfer.el = clip; 

    /* Console confirms event.dataTransfer.el is the jQuery object */ 
} 

function dropClip(target, event){ 

    target.append(event.dataTransfer.el); 

    /* event.dataTransfer.el no longer has the object... where'd it go?? */ 
} 

jQuery.event.props.push('dataTransfer'); 

$('#titles') 
    .bind('dragenter dragover', false) 
    .bind('drop', function(event){ 

     dropClip($(this), event); 
    }); 

$('.clip').bind('dragstart', function(event){ 

    dragClip($(this), event); 
}); 

UPDATE:

Viết lại để loại bỏ tính cách rườm rà. Có những thứ khác bao gồm trong đó, nhưng một chức năng ẩn danh sẽ làm tốt:

jQuery.event.props.push('dataTransfer'); 

$('#titles') 
    .bind('dragenter dragover', false) 
    .bind('drop', function(event){ 

     $(this).append(event.dataTransfer.el); 
    }); 

$('.clip').bind('dragstart', function(event){ 

    event.dataTransfer.el = $(this); 
}); 

CẬP NHẬT

Theo @ trả lời cuối cùng Barney, mã làm việc cuối cùng của tôi. Tôi nhận thấy rằng việc sử dụng sự kiện ban đầu không cho phép tôi chuyển đối tượng dưới dạng dữ liệu, vì vậy thay vào đó, tôi áp dụng ID và xây dựng lại đối tượng jQuery khi thả. Cũng thắt chặt mọi thứ bằng cách loại bỏ các hàm được khai báo. Ít mã hơn, cùng một kết quả.

$('#titles') 
    .bind('dragenter dragover', false) 
    .bind('drop', function(event){ 

     $(this).append($('#' + event.originalEvent.dataTransfer.getData('clip'))); 
    }); 

$('.clip') 
    .bind('dragstart', function(event){ 

     event.originalEvent.dataTransfer.setData('clip', $(this).attr('id')); 
    }); 
+0

+1 cho phần "CẬP NHẬT" này. Điều này đã giúp tôi. –

Trả lời

17

Cá nhân, tôi cố gắng chơi với nội dung jQuery càng ít càng tốt và trích xuất đối tượng sự kiện ban đầu nếu có thể. Khi sử dụng kéo và thả trong quá khứ, tôi đã luôn sử dụng event.originalEvent.dataTransfer.

+0

vâng, tôi coi như thế này. Nó thật kỳ lạ - tôi có thể gắn đối tượng jquery vào thuộc tính dataTransfer. Tôi có thể làm điều đó trong vani JS, không chắc chắn lý do tại sao nó sẽ làm việc khác nhau trong jQuery nếu dataTransfer được thêm vào mảng thuộc tính sự kiện – technopeasant

+0

Cá nhân, tôi cố gắng chơi với jQuery internals càng ít càng tốt. Khi sử dụng kéo và thả trong quá khứ, tôi đã luôn sử dụng 'event.originalEvent.dataTransfer'. – Barney

+1

Funnily đủ, bằng cách sử dụng mà thay vì thêm dataTransfer jQuery công trình. Tôi đã chấp nhận câu trả lời của bạn và đánh giá cao sự trợ giúp. Sẽ đánh giá cao gấp đôi nếu bạn có thể nối thêm câu trả lời của bạn với đề xuất của bạn về event.originalEvent để tham khảo của người khác – technopeasant

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