2012-02-12 4 views
0

私はspan.main{overflow:hidden}でトリミングされた3枚の写真があります。ユーザーはタッチイベントでスパンをパンし、画像の隠れた部分を探索できます。これまで

コード:

document.addEventListener('DOMContentLoaded', function() { 

var box = document.querySelector('.main'); 

     box.addEventListener("touchstart", onStart, false); 
     box.addEventListener("touchmove", onMove, false); 
     box.addEventListener("touchend", onEnd, false); 

}); 

var startOffsetX, startOffsetY; 
var moving = false; 

function getPos(ev) { 
return { 
    x: ev.touches ? ev.touches[0].clientX : ev.clientX, 
    y: ev.touches ? ev.touches[0].clientY : ev.clientY 
}; 
} 

function onStart(ev) { 
moving = true; 
var box = document.querySelector('.main');// I need something like $(this) 
var pos = getPos(ev); 
startOffsetX = pos.x + box.scrollLeft; 
startOffsetY = pos.y + box.scrollTop; 
if (ev.preventDefault) 
    ev.preventDefault(); 
else 
    ev.returnValue = false; 
} 

function onMove(ev) { 
if (moving) { 
    var pos = getPos(ev); 
    var x = startOffsetX - pos.x; 
    var y = startOffsetY - pos.y; 
    var box = document.querySelector('.main'); // I need something like $(this) 
    box.scrollLeft = x; 
    box.scrollTop = y; 
    if (ev.preventDefault) 
     ev.preventDefault(); 
    else 
     ev.returnValue = false; 
} 
} 
function onEnd(ev) { 
if (moving) { 
    moving = false; 
} 
} 

問題が予想通り最初のサムネイルが機能することです。私は試しました:

-querySelectorは最初の要素を返すので、IDを追加すればquerySelector('#box1,#box2,#box3')はうまくいきます。 Nein。私は機能に「この」問題があります...

- プレースイベント(Appleが示唆しているように)インライン<div class="box" onStart="ontouchstartCallback(ev);" ontouchend="onEnd(ev);"ontouchmove="onMove(ev);" > <img></div>はまだ解決策のように見えました...私の推測では、もう一度「これ」のために...

+1

Appleはインラインイベントを使用することを提案していますか?何。 。地獄。 – ThiefMaster

+0

https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW1 –

+0

提案のようには見えませんがインラインイベントが最も便利な方法のような簡単な例のように... – ThiefMaster

答えて

1

代わりにquerySelectorAllメソッドを使用します。これは、最初のサブツリーのみではなく、サブツリー内のすべての一致した要素を返します(これはquerySelectorです)。その後、ループを使用してループします(for)。

var elements = document.querySelectorAll('.main'); 
for (var i = 0, ii = elements.length; i < ii; ++i) { 
    var element = elements[i]; 
    element.ontouchstart = onStart; 
    // ... 
} 

あなたが取ることができます(そしてそれはおそらく1優れている)他のアプローチは、イベントの委任を使用し、親要素のイベントリスナーを設定し、targetプロパティをチェックすることにより、操作されている映像のかを決定することです各イベントの

<div id="pictures"> 
    <span class="main"><img /></span> 
    <span class="main"><img /></span> 
    <span class="main"><img /></span> 
</div> 

var parent = document.getElementById('pictures'); 
parent.ontouchstart = function (e) { 
    var box = e.target.parentNode; // parentNode because e.target is an Image 
    if (box.className !== 'main') return; 

    onStart(e, box); 
}; 
+0

ありがとうございました。forループとquerySelectorAllの例を親切に教えてください。私は今すぐ第2のアプローチを試みていますが、私はそれを完全には理解していないので、時間が必要です。この答えを受け入れる前に、他の良い魂がより良い説明を提供できるかどうかを見てみましょう。 –

+0

私の更新された回答を参照してください。ループのコードを追加しました。 –

関連する問題