2013-09-19 2 views
1

Это код: http://jsfiddle.net/nikunj2512/74qrC/18/создавая увеличенный дубликат d3.js элемента OnClick событие

Я использую d3.js.

То, что я пытаюсь сделать, - это когда пользователь нажимает на любой из прямоугольников, тогда из них будет отображаться точная копия прямоугольника, но большего размера (вдвое больше, чем исходный прямоугольник).

Я добавил метод onclick, а затем я создал большой прямоугольник, получив атрибуты старого прямоугольника. Но это не работает. пожалуйста, помогите мне

я не уверен, как это сделать ... Пожалуйста, помогите мне ...

var numVisible = 4; 
var rectWidth = 100, 
rectHeight = 100, 
rectPadding = 2, 
numRects = 10; 

var clipWidth = numVisible * rectWidth + (numVisible - 1) * rectPadding, 
clipHeight = rectHeight; 

var width = (rectWidth * numRects) + ((numRects - 1) * rectPadding), 
height = rectHeight; 

var data = d3.range(numRects); 
var xScale = d3.scale.linear() 
    .domain(d3.extent(data)) 
    .range([0, width - rectWidth]); 

var svg = d3.select('#chart').append('svg') 
    .attr('width', clipWidth) 
    .attr('height', clipHeight); 
var bigRectContainer = d3.select('#bigRectContainer').append('svg') 
    .attr('width', clipWidth*2) 
    .attr('height', clipHeight*2); 

svg.append("defs").append("clipPath") 
.attr("id", "clip") 
.append("rect") 
    .attr("width", clipWidth) 
    .attr("height", clipHeight); 

var g = svg.append("g"); 
g.selectAll("rect") 
.data(data) 
.enter() 
.append('rect') 
    .attr("class", "area").attr("clip-path", "url(#clip)") 
    .attr('x', xScale) 
    .attr('width', rectWidth) 
    .attr('height', rectHeight) 
    .style('fill', d3.scale.category20()); 

var update = function(){ 
g.selectAll("rect") 
    .transition().duration(500) 
    .attr('x', xScale); 
}; 

d3.select("#left").on("click", function(){ 
if(xScale.domain()[0] - 1 > -numVisible){ 
    xScale.domain([xScale.domain()[0] - 1, xScale.domain()[1] - 1]); 
    update(); 
}else if(xScale.domain()[0] - 1 == -numVisible) 
{ 
    xScale.domain([xScale.domain()[0] + numRects, xScale.domain()[1] + numRects]); 
    update(); 
} 
}); 

d3.select("#right").on("click", function(){ 
if(xScale.domain()[0] + 1 < numRects){ 
    xScale.domain([xScale.domain()[0] + 1, xScale.domain()[1] + 1]); 
    update(); 
}else if(xScale.domain()[0] + 1 == numRects) 
{ 
    xScale.domain([xScale.domain()[0] - numRects, xScale.domain()[1] - numRects]); 
    update(); 
} 
}); 


svg.selectAll("rect").on("click", function() { 
    var littleRect = d3.select(this); 
console.log(littleRect) 

var bigRect = bigRectContainer.append("rect").attr("width", littleRect.attr("width") * 2) 
    .attr("height", littleRect.attr("height") * 2) 
}); 

Пожалуйста, помогите мне ...

+0

вы хотите, чтобы все прямоугольника больше в то время? –

+0

Нет, когда я нажимаю на определенный прямоугольник, тогда я хочу создать дубликат прямоугольника, но большего размера. –

ответ

0

Вы можете зарегистрировать событие щелчка слушатель на ваших прямых с помощью selection.on. Он будет вызываться, когда щелчок будет нажат так, чтобы this ссылался на щелкнутый узел. Вы можете использовать это для создания нового прямоугольника с удвоенным размером.

g.selectAll("rects").on("click", function() { 
    var littleRect = d3.select(this); 

    bigRectContainer.select("rect").remove(); 
    bigRectContainer.append("rect") 
     .attr("class", "bigrect") 
     .attr("width", littleRect.attr("width") * 2) 
     .attr("height", littleRect.attr("height") * 2) 
     .style("fill", litteRect.attr("fill")); 
}); 
+0

Спасибо, но ваш код не работает. Когда я копирую и вставляю свой код в свой код, все прямоугольники исчезают .... Пожалуйста, отредактируйте в моем коде jsfiddle .... Спасибо –

+0

Похоже, я пропустил закрывающую скобку. Я добавил его сейчас. С учетом сказанного, этот код предназначен только для того, чтобы дать вам представление о том, как он должен работать. Я никоим образом не проверял его. Поэтому вам, возможно, придется прикоснуться к нему самим. Вы также заметите, что я ссылаюсь на выбор под названием «bigRectContainer», который, как я полагаю, настроен в другом месте вашего кода, чтобы ссылаться на контейнер, в который вы хотите добавить более крупный прямоугольник. –

+0

По-прежнему не работает..Когда я нажимаю, это не вызывает событие щелчка .... Пожалуйста, можете внести свои изменения в Jsfiddle ... –

0

Я получил это .. Были некоторые ошибки в коде, но я установил ...

var bigRectContainer = d3.select('#bigRectContainer').append('svg') 
    .attr('width', clipWidth*2) 
    .attr('height', clipHeight*2); 
svg.selectAll("rect").on("click", function() { 
var littleRect = d3.select(this); 
console.log(littleRect) 

var bigRect = bigRectContainer.append("rect").attr("width", littleRect.attr("width") * 2) 
    .attr("height", littleRect.attr("height") * 2).style('fill', d3.scale.category20()) 
}); 

Но спасибо ...

+0

Я просто собирался еще раз взглянуть на скрипку, когда увидел это так Я рад, что вы поняли это. Будьте осторожны с вашей линией заполнения, потому что вы создаете новую цветовую шкалу для каждого вызова, поэтому я думаю, что каждый раз вы будете иметь один и тот же цвет. Кроме того, вы не удаляете ранее добавленные прямоугольники в любом месте, чтобы вы каждый раз добавляли новые прямоугольники. Старые, вероятно, скрыты за новыми. –

+0

ОК Спасибо .. Я посмотрю, что –

Смежные вопросы