Cant set width of img element for.setDragImage [duplicate]

Оператор comma будет оценивать левый операнд, отбрасывать результат и затем оценивать правый операнд, и это будет результат. Использование идиоматического , как указано в ссылке, при инициализации переменных, используемых в цикле for, и дает следующий пример:

void rev(char *s, size_t len)
{
  char *first;
  for ( first = s, s += len - 1; s >= first; --s)
      /*^^^^^^^^^^^^^^^^^^^^^^^*/ 
      putchar(*s);
}

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

Из черновика стандарта C99 грамматика выглядит следующим образом:

expression:
  assignment-expression
  expression , assignment-expression

и параграф 2 говорит:

Левый операнд оператора запятой оценивается как выражение void; после его оценки появляется точка последовательности. Затем оценивается правый операнд; результат имеет свой тип и значение. 97). Если делается попытка изменить результат работы с запятой или получить доступ к ней после следующей точки последовательности, поведение не определено.

blockquote>

Сноска 97 говорит:

Оператор запятой не дает lvalue.

blockquote>

, что означает, что вы не можете назначить результат запятой .

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

#include 

int main()
{
    int x, y ;

    x = 1, 2 ;
    y = (3,4) ;

    printf( "%d %d\n", x, y ) ;
}

будет иметь следующий выход:

1 4

1
задан Duncan 13 October 2014 в 19:50
поделиться

2 ответа

Когда вы используете <img> в setDragImage, Javascript будет просто использовать фактические данные растрового изображения, игнорируя другие атрибуты, такие как width. Проверьте спецификации .

Однако, если вы сделаете что-то вроде этого:

function handleDragStart(e) {
    var dragIcon = document.createElement('img');
    dragIcon.src = 'http://jsfiddle.net/favicon.png';
    dragIcon.width = '100';
    var div = document.createElement('div');
    div.appendChild(dragIcon);
    document.querySelector('body').appendChild(div);
    e.dataTransfer.setDragImage(div, -10, -10);
}

http://jsfiddle.net/cnAhv/9 /

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

3
ответ дан Luizgrs 23 August 2018 в 01:18
поделиться
  • 1
    Это помещает изображение в документ и разбивает макет. Есть ли другие альтернативы? – pravin 11 August 2015 в 20:45
  • 2
    Возможно, вы захотите попробовать последнее решение в этом блоге link – pravin 11 August 2015 в 20:56

Этот ответ может быть немного запоздалым, но вы также можете использовать холст для масштабирования исходного изображения.

function handleDragStart(e) {
    var dragIcon = document.createElement('img');
    dragIcon.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC';
    var width = 100;
    var height = width * (3/4); // The height must be set explicitly. I'm assuming the image is 4:3 for this example
    var c = document.createElement("canvas");
    c.width = width;
    c.height = height;
    var ctx = c.getContext('2d');
    ctx.drawImage(dragIcon,0,0,width,height);
    dragIcon.src = c.toDataURL();
    e.dataTransfer.setDragImage(dragIcon, -10, -10);
}

http://jsfiddle.net/cnAhv/138/

Единственным недостатком этого является то, что холст может быть испорчен, если изображение не происходит от одного и того же происхождения. Подробнее о tainted холсты здесь

2
ответ дан Demnogonis 23 August 2018 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: