2017-11-15 43 views
1

私はジグソーパズルである古いコードを復活させようとしています。フォルダから画像(パズルピース)を読み込み、ランダムにページの周りに配置してから、ボードにドラッグアンドドロップします。これは以前から使用されていましたが、今日使用しようとするとエラーになります(下記参照)。ドラッグアンドドロップJavascriptパズル

HTML:

<body onload="init();" onmousemove="initDrag();" onmouseup="mousePress=false;"> 
    <div id="main"> 
    <div id="inside"> 
     <img src="holder.gif" style="position:absolute; left:500; top:500;" /> 
    </div> 
    </div> 
    <div style="position:absolute;top:10px;left:600px;display:none;"> 
    </div> 
    <p id="pText" class="congrats" style="position:absolute; top:410px; left:475px;"></p> 
    <p style="position:absolute; top:20px; left:750px;" class="links"><a href="hard.html">hard puzzle</a> | <a href="main.html">home</a></p> 
</body> 

Javascriptを:

// ARRAY FOR PLACEMENT OF IMAGES: [down, over] 
var place = new Array([51,300],[51,432],[51,569],[51,707],[112,300],[112,432],[112,569],[112,707],[199,300],[199,432],[199,569],[199,707],[286,300],[286,432],[286,569],[286,707]); 

var displayed = new Array(); 
var mousePress = false; 
var pieces = place.length; 
var placed = new Array(); 

var moveObject; 

function init() { 
    var append = ""; 
    for (i=0; i<pieces; i++) 
    { 
     append+= '<div onDrag="return false;" unselectable=on id="puzzle" name="puzzle" class="puzzleMain"><img src="img/us/img' + i + '.gif" onmousedown="mousePress=true;moveObject=' + i + ';if(document.all) {offsetX=window.event.offsetX;offsetY=window.event.offsetY;}" onmouseup="mousePress=false;doplace(' + i + ');"></div>'; 
     displayed[i] = 0; 
     placed[i]=0; 
    } 
    document.getElementById("main").innerHTML += append; 
    document.images[i].onload = rndmImg; 
} 

function rndmImg() { 
    x=855;y=50; 
    do { 
     do { 
      displayNext = Math.floor(Math.random()* pieces); 
     } while(displayed[displayNext]); 
     document.getElementsByName("puzzle")[displayNext].style.top = y; 
     document.getElementsByName("puzzle")[displayNext].style.left = x; 
     document.getElementsByName("puzzle")[displayNext].style.visibility="visible"; 
     displayed[displayNext]=1; 
     x += document.images[displayNext].width; 
     if(x >= 900) { 
      y += document.images[displayNext].height; 
      if (y>=300) { x=0 } else { x=851 } 
     } 
    } while(!allDisplayed()); 
} 

function allDisplayed() { 
    for(z=0; z<displayed.length; z++) if(!displayed[z]) return false; 
    return true; 
} 

function lower() { 
    for(p=0;p<document.getElementsByName("puzzle").length;p++) 
    document.getElementsByName("puzzle")[p].style.zIndex = 1; 
    document.getElementsByName("puzzle")[moveObject].style.zIndex=5; 
} 

function initDrag(e) { 
    if(!mousePress)return; 
    if(document.getElementById("inside").innerHTML != "") document.getElementById("inside").innerHTML = ""; 
    lower(); 
    if(document.all) { 
     mouseX = window.event.clientX - (offsetX); 
     mouseY = window.event.clientY - (offsetY); 
    } else { 
     mouseX = e.clientX - 50; 
     mouseY = e.clientY - 50; 
    } 
    document.getElementsByName("puzzle")[moveObject].style.top=mouseY; 
    document.getElementsByName("puzzle")[moveObject].style.left=mouseX; 
    return false; 
} 

function doplace(index) { 
    w = document.images[index].width; 
    h = document.images[index].height; 
    t = parseInt(document.getElementsByName("puzzle")[index].style.top); 
    l = parseInt(document.getElementsByName("puzzle")[index].style.left); 

    if ((l >= place[index][1]-(w/2) && l <= place[index][1]+(w/2)) && (t >= place[index][0]-(h/2) && t <= place[index][0] + (h/2))) 
    { 
     document.getElementsByName("puzzle")[index].style.top = place[index][0]; 
     document.getElementsByName("puzzle")[index].style.left = place[index][1]; 
     placed[index] = 1; 
     if(isComplete()) 
      pText.innerHTML = "Puzzle is complete!"; 
    } 

} 

function generateArray() 
{ 
    append="var place = new Array("; 
    for(i=0; i<document.getElementsByName("puzzle").length; i++) 
    { 
     t = document.getElementsByName("puzzle")[i].style.pixelTop; 
     l = document.getElementsByName("puzzle")[i].style.pixelLeft; 
     append+="[" + t + "," + l + "],"; 
    } 
    document.forms[0].mArray.value = append; 
} 

function isComplete() 
{ 
    for(q=0;q<placed.length;q++) if(!placed[q])return false; 
    return true; 
} 

私はほとんど得るエラーは次のとおりです。キャッチされない例外TypeError:プロパティを読み取ることができませんinitDragで 未定義の 'clientX'(easy.html:70) at HTMLBodyElement.onmousemove(easy.html:116)

私はJSFiddle hereです。どのような問題が起こっているのか誰にでもわかることができますか?あなたは、マウスの移動上の任意の引数なしinitDrag()を呼び出すためdocument.allがfalsyその後、mouseX = e.clientX - 50であれば、あなたがそうonmousemove="initDrag();"を持っているあなたのコードで

+0

グローバルイベントオブジェクトに頼るのではなく、渡されたイベントオブジェクト( 'e')を使用します。すべてのブラウザで実装されているわけではありません。古いIEをサポートしたいのですが、 'document.all'ではなく' e'を確認してください。 Ex。 FFの 'document.all'はサポートされていますが、グローバルイベントオブジェクトはサポートされていません。 – Teemu

答えて

1

Cannot read property 'clientX' of undefinedをスローしていました。

document.allwindow.eventのどちらも使用しないでください。どちらも残念です。

+0

それは答えです。これは、IE 6、7、および8(IEエミュレーション経由)で正常に動作します。私は古いコードを更新する作業をします。ありがとう! – joshmerd

+0

@joshmerd IE 6,7,8をサポートするためには必要ですか?私は新しいプロジェクトに参加している人たちには支援をしません。私はIE 9を除外します。 –

+0

いいえ、まったくありません。私が持っていたいくつかの古いコードを辿っていただけで、もう少し前に作ったこの小さなプロジェクトに出会った。 – joshmerd

関連する問題