2012-06-14 39 views
0

我有一个问题,我在画布上实现了一个裁剪自定义矩形我在Javascript中做了一个函数,当裁剪函数被称为在现有画布上创建一个孩子,然后与我绘制矩形的JQuery侦听器。当侦听器不工作时,childNode被正确创建,他们没有得到事件。这是我的代码:在画布上的JQuery监听器孩子不工作

var dragging = false; 
var xstart = 0; 
var ystart = 0; 
var width = 0; 
var height = 0; 
var ctxotmp = null; 
var ctxtmp = null; 
var canvastmp = null; 
var mycanvas = null; 
function draw() { 
ctxtmp.fillRect(xstart, ystart, width, height); 
} 

function init() { 
    mycanvas = $('#mycanvas')[0]; 
    // create temp canvas 
    canvastmp = document.createElement('canvas'); 
    canvastmp.id = "mycanvastmp"; 
    canvastmp.width = mycanvas.width; 
    canvastmp.height = mycanvas.height; 
    mycanvas.parentNode.appendChild(canvastmp); 
    $("#mycanvastmp").css({position:"absolute",top:$("#mycanvas").css("top"),left:$("#mycanvas").css("left")}); 
    canvastmp = $('#mycanvastmp')[0]; 
    ctxtmp = canvastmp.getContext('2d'); 
    ctxtmp.lineWidth = 1; 
    ctxtmp.fillStyle = "rgba(0, 0, 0, 0.5)"; 
} 
//listener 
$('#mycanvastmp').mousedown(function(e) { 
    var xoffs = $(this).offset().left; 
    var yoffs = $(this).offset().top; 
    xstart = e.pageX - xoffs; 
    ystart = e.pageY - yoffs; 
    dragging = true; 
    }); 

    $('#mycanvastmp').mousemove(function(e) { 
    if(dragging) { 
     var xoffs = $(this).offset().left; 
     var yoffs = $(this).offset().top; 
     width = e.pageX - xoffs - xstart; 
     height = e.pageY - yoffs - ystart; 
     ctxtmp.clearRect(0, 0, $(this).width(), $(this).height()); 
     draw(); 
    } 
    }); 

    $('#mycanvastmp').mouseup(function() { 
    dragging=false; 
    alert('The rectangle for crop (x, y, width, height): ' + xstart + ', ' + ystart + ', ' + width + ', ' + height); 
    }); 

有人可以帮我吗?

+0

你应该设定听众之前调用初始化。 – Musa

回答

0

您需要使用.onon method以便将事件绑定到动态创建的对象。当您的页面最初加载并且dom触发时,它看不到tempCanvas,因此它最初不会附加它们。

//listener 
$('body').on('mousedown' ,'#mycanvastmp', function(e) { 

    var xoffs = $(this).offset().left; 
    var yoffs = $(this).offset().top; 
    xstart = e.pageX - xoffs; 
    ystart = e.pageY - yoffs; 
    dragging = true; 
    }); 

    $('body').on('mousemove' ,'#mycanvastmp', function(e) { 
    if(dragging) { 
     var xoffs = $(this).offset().left; 
     var yoffs = $(this).offset().top; 
     width = e.pageX - xoffs - xstart; 
     height = e.pageY - yoffs - ystart; 
     ctxtmp.clearRect(0, 0, $(this).width(), $(this).height()); 
     draw(); 
    } 
    }); 

$('body').on('mouseup' ,'#mycanvastmp', function(e) { 
    dragging=false; 
    alert('The rectangle for crop (x, y, width, height): ' + xstart + ', ' + ystart + ', ' + width + ', ' + height); 
    }); 

init(); 

Live Demo

0

看起来是创建临时画布前,像你附加的事件。 要么附加在init()功能的事件增加临时画布到DOM后或使用.delegate().on()

$("#mycanvas").on("mouseup", "#mycanvastmp", function() { 
    //... 
});