2012-06-14 72 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() { 
    //... 
});