2017-12-06 13 views
0

私は、サーバに置かずにPCのどこからでも実行すると、それは完全に動作しますが、サーバに置いたときに呼び出すコードがありますこれがなぜ起こるか私は理解していないサーバに置いたときにJavaScriptが動作しない

キャッチされないにReferenceError:::crearLienzoは、オンロードで が定義されていない(81(インデックス))それは、それは私に、次のエラーが発生します。皆さん、ありがとうございました!

<html> 
<head> 
<script type="text/javascript" src="jquery-3.2.1.min.js"></script> 
<script type="text/javascript" > 
    var movimientos = new Array(); 
    var pulsado; 
    function crearLienzo() { 
    var canvasDiv = document.getElementById('lienzo'); 
canvas = document.createElement('canvas'); 
canvas.setAttribute('width', 200); 
canvas.setAttribute('height', 200); 
canvas.setAttribute('id', 'canvas'); 
canvasDiv.appendChild(canvas); 
if(typeof G_vmlCanvasManager != 'undefined') { 
    canvas = G_vmlCanvasManager.initElement(canvas); 
} 
context = canvas.getContext("2d"); 

    $('#canvas').mousedown(function(e){ 
     pulsado = true; 
     movimientos.push([e.pageX - this.offsetLeft, 
      e.pageY - this.offsetTop, 
      false]); 
     repinta(); 
    }); 

    $('#canvas').mousemove(function(e){ 
     if(pulsado){ 
      movimientos.push([e.pageX - this.offsetLeft, 
       e.pageY - this.offsetTop, 
       true]); 
     repinta(); 
     } 
    }); 

    $('#canvas').mouseup(function(e){ 
     pulsado = false; 
    }); 

    $('#canvas').mouseleave(function(e){ 
     pulsado = false; 
    }); 
    repinta(); 

} 


    function repinta() { 
     // función para dibujar en el lienzo los movimientos del ratón que hemos 
     // recogido en la variable "movimientos" 
     canvas.width = canvas.width; // Limpia el lienzo 

    context.strokeStyle = "#0000a0"; 
    context.lineJoin = "round"; 
    context.lineWidth = 6; 

    for(var i=0; i < movimientos.length; i++) 
    {  
    context.beginPath(); 
    if(movimientos[i][2] && i){ 
     context.moveTo(movimientos[i-1][0], movimientos[i-1][1]); 
    }else{ 
     context.moveTo(movimientos[i][0], movimientos[i][1]); 
    } 
    context.lineTo(movimientos[i][0], movimientos[i][1]); 
    context.closePath(); 
    context.stroke(); 
    } 
} 
function convertCanvasToImage(canvas) { 
       var image = new Image(); 
       image.src = canvas[0].toDataURL("image/png"); 
     alert(image); 
       return image; 
} 
</script> 
</head> 
<body style="background: #eee;" onload="crearLienzo()"> 
<div id="lienzo" style="width: 200px; height: 200px; background: #fff;"></div> 
<button type="button" onclick="convertCanvasToImage($('#canvas'));">aa</button> 

</body> 
</html> 
+0

どのブラウザですか?どのサーバーですか?サーバーリソースを参照しているので、webappにjqueryが埋め込まれていますか?コードに入力ミスがあります(たとえば、 'getElemenatById'など)本当にうまくいきますか?なぜあなたはjQueryを持っている場合、裸のDOM操作関数(getElementById)を使用していますか?なぜあなたはjsfiddleのようなWeb対応ツールで直接ビルドしていないのですか? – andy

答えて

1

がgoogleapisライブラリから最初

<html> 
    <head> 
    <script type="text/javascript" src="jquery-3.2.1.min.js"></script> 

    </head> 
    <body style="background: #eee;" onload="crearLienzo()"> 
<script type="text/javascript" > 
     var movimientos = new Array(); 
     var pulsado; 
     function crearLienzo() { 
     var canvasDiv = document.getElementById('lienzo'); 
    canvas = document.createElement('canvas'); 
    canvas.setAttribute('width', 200); 
    canvas.setAttribute('height', 200); 
    canvas.setAttribute('id', 'canvas'); 
    canvasDiv.appendChild(canvas); 
    if(typeof G_vmlCanvasManager != 'undefined') { 
     canvas = G_vmlCanvasManager.initElement(canvas); 
    } 
    context = canvas.getContext("2d"); 

     $('#canvas').mousedown(function(e){ 
      pulsado = true; 
      movimientos.push([e.pageX - this.offsetLeft, 
       e.pageY - this.offsetTop, 
       false]); 
      repinta(); 
     }); 

     $('#canvas').mousemove(function(e){ 
      if(pulsado){ 
       movimientos.push([e.pageX - this.offsetLeft, 
        e.pageY - this.offsetTop, 
        true]); 
      repinta(); 
      } 
     }); 

     $('#canvas').mouseup(function(e){ 
      pulsado = false; 
     }); 

     $('#canvas').mouseleave(function(e){ 
      pulsado = false; 
     }); 
     repinta(); 

    } 


     function repinta() { 
      // función para dibujar en el lienzo los movimientos del ratón que hemos 
      // recogido en la variable "movimientos" 
      canvas.width = canvas.width; // Limpia el lienzo 

     context.strokeStyle = "#0000a0"; 
     context.lineJoin = "round"; 
     context.lineWidth = 6; 

     for(var i=0; i < movimientos.length; i++) 
     {  
     context.beginPath(); 
     if(movimientos[i][2] && i){ 
      context.moveTo(movimientos[i-1][0], movimientos[i-1][1]); 
     }else{ 
      context.moveTo(movimientos[i][0], movimientos[i][1]); 
     } 
     context.lineTo(movimientos[i][0], movimientos[i][1]); 
     context.closePath(); 
     context.stroke(); 
     } 
    } 
    function convertCanvasToImage(canvas) { 
      var image = new Image(); 
      image.src = canvas[0].toDataURL("image/png"); 
      alert(image); 
      return image; 
    } 
    </script> 
    <div id="lienzo" style="width: 200px; height: 200px; background: #fff;"></div> 
    <button type="button" onclick="convertCanvasToImage($('#canvas'));">aa</button> 

    </body> 
    </html> 
+0

"あなたのスクリプトタグをボディの中に入れて最初にロードする" - 頭の代わりにボディに置くと**後で**ロードされます。どのようにしてこの問題が解決されますか? – Quentin

+0

私はこのコードを実行して解決策を得ました。私はposted.Butステートメントを申し訳ありません。\t "最初に読み込むために本体の中にスクリプトタグを入れてください" –

+0

ありがとう、ありがとう!それはあなたのソリューションで完璧に動作します! – alberto

-1

使用jQueryライブラリをロードするために体内のスクリプトタグを入れてください。 bodyタグの最後の前にscriptタグを含めます。

<html> 
<head> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
</head> 
<body style="background: #eee;" onload="crearLienzo()"> 
<div id="lienzo" style="width: 200px; height: 200px; background: #fff;"></div> 
<button type="button" onclick="convertCanvasToImage($('#canvas'));">aa</button> 
<script type="text/javascript" > 
    var movimientos = new Array(); 
    var pulsado; 
    function crearLienzo() { alert('hea'); 
    var canvasDiv = document.getElementById('lienzo'); 
canvas = document.createElement('canvas'); 
canvas.setAttribute('width', 200); 
canvas.setAttribute('height', 200); 
canvas.setAttribute('id', 'canvas'); 
canvasDiv.appendChild(canvas); 
if(typeof G_vmlCanvasManager != 'undefined') { 
    canvas = G_vmlCanvasManager.initElement(canvas); 
} 
context = canvas.getContext("2d"); 

    $('#canvas').mousedown(function(e){ 
     pulsado = true; 
     movimientos.push([e.pageX - this.offsetLeft, 
      e.pageY - this.offsetTop, 
      false]); 
     repinta(); 
    }); 

    $('#canvas').mousemove(function(e){ 
     if(pulsado){ 
      movimientos.push([e.pageX - this.offsetLeft, 
       e.pageY - this.offsetTop, 
       true]); 
     repinta(); 
     } 
    }); 

    $('#canvas').mouseup(function(e){ 
     pulsado = false; 
    }); 

    $('#canvas').mouseleave(function(e){ 
     pulsado = false; 
    }); 
    repinta(); 

} 


    function repinta() { 
     // función para dibujar en el lienzo los movimientos del ratón que hemos 
     // recogido en la variable "movimientos" 
     canvas.width = canvas.width; // Limpia el lienzo 

    context.strokeStyle = "#0000a0"; 
    context.lineJoin = "round"; 
    context.lineWidth = 6; 

    for(var i=0; i < movimientos.length; i++) 
    {  
    context.beginPath(); 
    if(movimientos[i][2] && i){ 
     context.moveTo(movimientos[i-1][0], movimientos[i-1][1]); 
    }else{ 
     context.moveTo(movimientos[i][0], movimientos[i][1]); 
    } 
    context.lineTo(movimientos[i][0], movimientos[i][1]); 
    context.closePath(); 
    context.stroke(); 
    } 
} 
function convertCanvasToImage(canvas) { 
     var image = new Image(); 
     image.src = canvas[0].toDataURL("image/png"); 
     alert(image); 
     return image; 
} 
</script> 

</body> 
</html> 

この方法ではすべてのところで動作します。また、bodyタグの末尾にscriptタグが含まれているため、すべてのcssおよびimageファイルがロードされた後に読み込まれます。

+0

"googleapisライブラリのjQueryライブラリを使用する" - なぜですか?問題は、エラーメッセージは '$'ではなく 'crearLienzo'に関するメッセージです – Quentin

+0

コードのデバッグでは、サーバー上のbodyタグの最後の前に関数(crearLienzo)が含まれていると、関数crearLienzoが完全に呼び出されます。さらに、jqueryライブラリをダウンロードしてサーバーにロードするのは悪い習慣です。あなたは間違いなくそれをHosted Librariesからロードするべきです。 – Optimizer

関連する問題