JavaScript-как использовать «mousedown», чтобы «выбрать» изображение на холсте

У меня есть следующая функция JavaScript mousedown, которую я использую, чтобы определить, когда на одном из изображений, которые я отображал на холсте HTML5, было выполнено "mousedown":

_mousedown: function(evt) {
    this._setUserPosition(evt);
    var obj = this.getIntersection(this.getUserPosition());
    if(obj && obj.shape) {
        var shape = obj.shape;
        this.clickStart = true;
        shape._handleEvent('mousedown', evt);
        displayTip(obj.shape.index);

        console.log(obj);
    }

Как вы можете видеть, всякий раз, когда выполняется 'наведение мыши' на часть холста, на которой есть нарисованный объект, эта функция вызывает функцию displayTip.

В настоящее время функция displayTip выглядит так:

function displayTip(index){
    document.getElementById('tipsParagraph').innerHTML = tips[index];
    console.log("displayTip being called");
    console.log("canvasImage id = " + canvasImage.id);
}

Теперь функция mousedown работает частично правильно, поскольку при вызове displayTip эта функция затем обновляет содержимое абзаца tipsParagraph до того, что хранится в массиве tips в позиции index. Однако, как видите, в конце функции displayTip у меня есть строка

`console.log("canvasImage id = " + canvasImage.id);

и в конце функции mousedown у меня есть строка

console.log(obj);

Насколько я понимаю, любой объект, обнаруженный в момент щелчка на холсте, будет сохранен в переменной obj, как определено строкой

var obj = this.getIntersection(this.getUserPosition());

Но в консоли журнал в конце моей функции displayTip() сообщает, что canvasImage.id не определено, а журнал в конце моей функции mousedown сообщает, что значение переменной obj равно [object Object]

Я не уверен, почему мой canvasImage.id не определен... он должен отображать атрибут ID изображения, на котором был обнаружен mousedown... есть идеи, почему этого не происходит?

Предположительно, журнал консоли value of variable obj:[object Object] означает, что mousedown «захватил» изображение в позиции mousedown, поэтому он должен отображать идентификатор этого объекта, не так ли?

Редактировать 03.01.2013 в 14:35

Код для изображения холста выглядит следующим образом:

Сначала он определяется как глобальная переменная в начале файла вместе со всеми другими моими глобальными переменными с помощью строки:

var canvasImage;

Следующее использование происходит в моей функции 'drawImage()', где я использовал ее следующим образом:

var canvasImage = new Kinetic.Image({
      image: imageObj,
      width: 50,
      height: 50,
      // puts the image in teh middle of the canvas
      x: randomPosition(0, 950),  //imageX,    //stage.getWidth() / 2 - 50 / 2,
      y: randomPosition(30, 350),  //imageY,    //stage.getHeight() / 2 - 50 / 2,
      draggable: true
    });

Я не уверен, что это правильный способ сделать это, но я хочу использовать функцию mousedown, чтобы «получить» любое изображение, на котором вызывается функция mousedown, и сохранить это конкретное изображение в переменной временно вместе со всеми его атрибутами (id, ширина, высота, x, y), чтобы я мог получить доступ к этим атрибутам для использования другими фрагментами кода.


person Noble-Surfer    schedule 01.03.2013    source источник
comment
stackoverflow.com/ вопросы/10001283/   -  person JohannesAndersson    schedule 01.03.2013
comment
Это не совсем ответ на вопрос, который я задал...   -  person Noble-Surfer    schedule 01.03.2013


Ответы (2)


"canvasImage" не определен, и это правильно! В функции вы никогда не объявляете этот объект. А для объекта "obj" вы должны попытаться дать нам содержание... потому что так очень сложно понять проблему.

person Metal3d    schedule 01.03.2013
comment
canvasImage был определен как глобальная переменная со строкой var canvasImage; в начале файла... Что вы имеете в виду под контекстом obj - все его использование есть в примере кода в моем исходном посте, так что это полный контекст. Я добавлю код, где определяется canvasImage. - person Noble-Surfer; 01.03.2013
comment
Хорошо, но вы говорите, что obj — это [object Object]. Я имею в виду, что было бы неплохо иметь содержимое этого объекта, чтобы помочь вам. - person Metal3d; 01.03.2013
comment
Что должно происходить, когда на изображении обнаруживается mousedown, так это то, что это изображение и все его атрибуты (id, высота, ширина, x, y) хранятся в переменной obj' temporarily (i.e. just while the mousedown`, так что я могу получить доступ атрибуты этого конкретного изображения непосредственно из этой переменной. - person Noble-Surfer; 01.03.2013
comment
Поскольку я сказал вам использовать console.log, вы должны передавать в консоль только obj, а не строку :: console.log(obj). Таким образом, вы можете увидеть свойства каждого объекта. Кстати, ответ markE кажется хорошим - person Metal3d; 06.03.2013

Вот как получить доступ к атрибутам ваших изображений во время событий мыши

Просто подпишитесь на интересующее вас событие мыши и укажите функцию для вызова этого события.

Объект «this» в вашей функции — это объект Kinetic.Image, и вы можете вызвать getXXX() для получения любых интересующих вас атрибутов.

        myImage.on('mouseup', function() {
          var att="Id: "+this.getId();
          att+=", width:"+this.getWidth();
          att+=", height:"+this.getHeight();
          att+=", x:"+this.getX();
          att+=", y:"+this.getY();
          att+=", image:"+this.getImage();
          alert(att);
          console.log(att);
        });

Вот код и скрипт: http://jsfiddle.net/m1erickson/2Qt97/

тело {поле: 0px; отступ: 0px; }

  function initStage(images) {

    var stage = new Kinetic.Stage({
      container: 'container',
      width: 300,
      height: 300
    });

    var layer = new Kinetic.Layer();

    var img=new Image();
    var coffee;
    img.onload=function(){
        coffee=new Kinetic.Image({
            x:125,
            y:100,
            name:"Yum!",
            id:"coffeePic",
            image:img
        });
        layer.add(coffee);
        stage.add(layer);

        coffee.on('mouseup', function() {
          var att="Id: "+this.getId();
          att+=", width:"+this.getWidth();
          att+=", height:"+this.getHeight();
          att+=", x:"+this.getX();
          att+=", y:"+this.getY();
          att+=", image:"+this.getImage();
          alert(att);
          console.log(att);
        });

    }
    img.src="http://dl.dropbox.com/u/139992952/coffee.png";

  }
  initStage();

</script>

person markE    schedule 02.03.2013