javascript - Chrome 上的 HTML5 canvas 和 php 无法正常工作

标签 javascript php jquery html canvas

我很想为此创建一个 fiddle 来展示,但我正在使用 php,它不允许我在其中使用 php,所以我希望有人仍然知道发生了什么!

我有一个 javascript,它本身就可以完全正常工作。它是一个 HTML 单击并拖动 Canvas 。当您单击 Canvas 旁边的按钮时,单击和拖动会被限制在一个圆圈内,并将图像绘制到 Canvas 上。此按钮调用将图像绘制到 Canvas 上并使其可单击和拖动的方法。我已经亲自对此进行了测试,效果非常好。当我添加一行简单的 php 代码时,我的单击并拖动 Canvas 将停止移动图像。当您单击按钮来绘制图像时,这可以工作,但您无法移动图像。

我很困惑,因为我使用的 php 与 Canvas 中发生的事情无关。这是代码:

还需要指出的是,这段代码在 safari 中运行良好,但在 chrome 中根本不起作用,所以我知道它与 chrome 有关,我只是不明白问题是什么。

我的问题主要是,是否有一种方法可以让 safari 加载与 chrome 相比,从而影响在同一页面上运行 javascript 和 php,因为它在一个浏览器中工作正常,而在另一个浏览器中则不然。我刚刚添加了代码,以便人们知道我指的是什么。

这是 PHP

<dl class="header">
<?php
    $name = $_GET['id'];
    if ($name=="bracelet") {
       echo "<li>Design x!</li>";
    }
    elseif ($name=="purse") {
       echo "<li>Design y!</li>";
    }
    elseif ($name=="ring") {
       echo "<li>Design z!</li>";
    }
?>
</dl>

这是完整的代码

<HTML>
<HEAD>
<style>
#canvas {
   border:1px solid red;
}
</style>

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</HEAD>
<BODY>
<dl class="header">
<?php
    $name = $_GET['id'];
    if ($name=="bracelet") {
       echo "<li>Design x!</li>";
    }
    elseif ($name=="purse") {
       echo "<li>Design y!</li>";
    }
    elseif ($name=="ring") {
       echo "<li>Design z!</li>";
    }
?>
</dl>

<h5>Add Images and Canvases with the buttons<br>
Click to select which image to move.<br>
Then move the mouse to desired drop location<br>
and click again to drop the image there.</h5>

<canvas id="canvas" width=300 height=300></canvas>
<input type="image" src="http://s25.postimg.org/tovdg674b/crystal_003.png" id="button1" width="35"     height="20"></input>
<input type="image" src="http://s25.postimg.org/ph0l7f5or/crystal_004.png" id="button2" width="35" height="20"></input>
<input type="image" src="http://s25.postimg.org/60fvkwakr/crystal_005.png" id="button3" width="35" height="20"></input>
<input type="image" src="http://s25.postimg.org/fz5fl49e3/crystal_006.png" id="button4" width="35" height="20"></input>
<button id="save">save</button>
 <br>
<script>
// canvas stuff
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var centerX = canvas.width / 2;
var centerY = canvas.height / 2;
var radius = 50;

var contexts = [];
var points = [];

// image stuff
var states = [];
var img = new Image();
img.onload = function () {}
img.src = "http://s25.postimg.org/5qs46n4az/crystal_009.png";

setUpCanvas();
setUpPoints();

function setUpCanvas() {
   contexts.push(canvas.getContext("2d"));
   // link the new canvas to its context in the contexts[] array
   canvas.contextIndex = contexts.length;
   // wire up the click handler
   canvas.onclick = function (e) {
      handleClick(e, this.contextIndex);
   };
  // wire up the mousemove handler
  canvas.onmousemove = function (e) {
      handleMousemove(e, this.contextIndex);
   };
   canvas.addEventListener('dblclick', function() {
                        removeState(this.contextIndex);
                        });
}

function setUpPoints() {
   //points that make up a circle circumference to an array
   points = [];
   for (var degree=0; degree<360; degree++) {
    var radians = degree * Math.PI/180;
    var TO_RADIANS = Math.PI/180;
    var xpoint = centerX + radius * Math.cos(radians);
    var ypoint = centerY + radius * Math.sin(radians);
    points.push({
                x: xpoint,
                y: ypoint
                });
}
ctx.beginPath();
ctx.moveTo(points[0].x + 4, points[0].y + 4)
//draws the thin line on the canvas
for (var i = 1; i < points.length; i++) {
    var pt = points[i];
    ctx.lineTo(pt.x + 4, pt.y + 4);
}
ctx.stroke(); //end of drawing the thin line
}

function addCircle() {
   ctx.beginPath();
   ctx.moveTo(points[0].x + 4, points[0].y + 4)
   //draws the thin line on the canvas
   for (var i = 1; i < points.length; i++) {
    var pt = points[i];
    ctx.lineTo(pt.x + 4, pt.y + 4);
  }
   ctx.stroke(); //end of drawing the thin line
 }

function clearAll() {
   //Clear all canvases
   for (var i = 0; i < contexts.length; i++) {
      var context = contexts[i];
      context.clearRect(0, 0, canvas.width, canvas.height);
  } 
}

function handleClick(e, contextIndex) {

    e.stopPropagation();

   var mouseX = parseInt(e.clientX - e.target.offsetLeft);
   var mouseY = parseInt(e.clientY - e.target.offsetTop);

   for (var i = 0; i < states.length; i++) {

      var state = states[i];
      console.log(state);

    if (state.dragging) {
        state.dragging = false;
        state.draw();
        continue;
    }
    if (state.contextIndex == contextIndex && mouseX > state.x && mouseX < state.x + state.width && mouseY > state.y && mouseY < state.y + state.height) {
        state.dragging = true;
        state.offsetX = mouseX - state.x;
        state.offsetY = mouseY - state.y;
        state.contextIndex = contextIndex;
    }
    state.draw();
  }
}

function handleMousemove(e, contextIndex) {
   e.stopPropagation();

   var mouseX = parseInt(e.clientX - e.target.offsetLeft);
   var mouseY = parseInt(e.clientY - e.target.offsetTop);
   clearAll();
   addCircle();
   var minDistance = 1000;
   var minPoint = -1;

   for (var i = 0; i < states.length; i++) {

    var state = states[i];

    if (state.dragging) {
        for (var i = 0; i < points.length; i++) {
            var pt = points[i];
            var dx = mouseX - pt.x;
            var dy = mouseY - pt.y;
            if ((dx > 0 && dx>120)) {
                state.x = mouseX - state.offsetX;
                state.y = mouseY - state.offsetY;
                state.contextIndex = contextIndex;
            } else if ((dx < 0 && dx < -120)) {
                state.x = mouseX - state.offsetX;
                state.y = mouseY - state.offsetY;
                state.contextIndex = contextIndex;
            }
            else {
                var distance = Math.sqrt(dx * dx + dy * dy);
                if (distance < minDistance) {
                    minDistance = distance;
                    //points in relation to the constrained line (where it will be drawn to)
                    //reset state.x and state.y to closest point on the line
                    state.x = pt.x - img.width / 2;
                    state.y = pt.y - img.height / 2;
                    state.contextIndex = contextIndex;
                }
            }
        }

    }
    state.draw();
   }
}

function removeState(contextIndex) {
   for (var i = 0; i < states.length; i++) {

    var state = states[i];
    state.remove();
   }
}

function addState(image) {
   var ptxy = points[1];
   state = {}
   state.dragging = false;
   state.contextIndex = 1;
   state.image = image;
   state.x = ptxy.x - image.width / 2;
   state.y = ptxy.y - image.height / 2;
   state.width = image.width;
   state.height = image.height;
   state.offsetX = 0;
   state.offsetY = 0;
   state.draw = function () {
    var context = contexts[this.contextIndex - 1];
    if (this.dragging) {
        context.strokeStyle = 'black';
        context.strokeRect(this.x, this.y, this.width + 2, this.height + 2)
    }
    context.drawImage(this.image, this.x, this.y);
}
state.draw();
return (state);
}
function save() {
   // var data = ctx.getImageData(0, 0, canvas.width, canvas.height);

}

$("#button1").click(function () {
                states.push(addState(img));
                });
$("#button2").click(function () {
                states.push(addState(img));
                });
$("#button3").click(function () {
                states.push(addState(img));
                });
$("#button4").click(function () {
                states.push(addState(img));
                });
$("#save").click(function () {
             save();
             });


</script> 
</BODY>
</HTML>

最佳答案

任何好奇并想知道我如何解决这个问题的答案的人都可以在这里。我对 HTML5 canvas 及其工作原理不熟悉。经过大量的试验和错误,我发现一旦 Canvas 从屏幕顶部更改到其他位置, Canvas 偏移量就会错误。就这么简单......

关于javascript - Chrome 上的 HTML5 canvas 和 php 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048617/

相关文章:

php - Laravel 5 并发请求和预定作业

php - 为什么不推荐使用 PHP 的 mysql_ 函数?

php - 令人费解的 php 递归

Fancybox 的 Javascript/Jquery 回调 是 否 确认

javascript - 动态表格如果复选框为空() td单元格与JS

javascript - 从 Silverlight 调用 Javascript 函数时,函数出现错误 "failed to invoke"

javascript - 递归:从数组javascript中获取对象

javascript - 语法荧光笔不工作

jquery - 是否可以利用 `display:none` 和 `display:inline` 来取消隐藏嵌套的隐藏元素?

javascript - 使用 jquery 垂直翻转