大きな配列があり、テーブルにレンダリングする必要があります。すべてのアイテムをレンダリングする代わりに、私はいくつかのアイテムを水平方向と垂直方向にレンダリングしています。次に、マウススクロールに基づくスクロールで、垂直/水平の更新テーブル値が発生したかどうかを確認します。しかし、私はこのスクロールで水平方向のデータ更新が機能しない
に2つの問題はここに私のコード
- 水平にデータが更新されない、スクロールに問題ある持っています。
- 水平方向にスクロールすると、画面もちらつきます。
- 水平要素が正しく配置されていません。ここで
ここhttp://jsbin.com/oSOsIQe/2/edit
jsbinリンクでJSのコードですが、私はコードがきれいではありません知っているが、私は後でそれをきれいにします。
var $matrix = (function() {
function $matrix(data, holder, hidescrollbar, config) {
var header_h = config.header || "150px";
var data_h = config.header || "90px";
!data && (function() {
// Fake Data, will be removed later
data = new Array(50000);
for (var i = 0, l = data.length; i < l; i++) {
var dummy = Math.random().toString(36).substring(5);
var dum = [];
for (var j = 0; j < 26; j++) {
dum.push(dummy + i);
}
data[i] = dum;
}
}());
hidescrollbar = hidescrollbar || false;
var heightForcer = holder.appendChild(document.createElement('div'));
heightForcer.id = "heightForcer";
var view = null;
//get the height of a single item
var dimensions = (function() {
//generate a fake item and calculate dimensions of our targets
var div = document.createElement('div');
div.style.height = "auto";
div.innerHTML = "<div class='rowHeader'>fake</div><div class='rowData'>fake</div>";
holder.appendChild(div);
var output = {
row: div.firstChild.offsetHeight,
header: div.firstChild.offsetWidth,
data: div.lastChild.offsetWidth
}
holder.removeChild(div);
return output;
})();
function refreshWindow() {
//remove old view
if (view != null) {
view.innerHTML = "";
} else {
//create new view
view = holder.appendChild(document.createElement('div'));
}
var firstItem = Math.floor(holder.scrollTop/dimensions.row);
var lastItem = firstItem + Math.ceil(holder.offsetHeight/dimensions.row) + 1;
if (lastItem + 1 >= data.length) lastItem = data.length - 1;
var hfirstItem = Math.floor(holder.scrollLeft/dimensions.data);
var hlastItem = hfirstItem + Math.ceil(holder.offsetWidth/dimensions.data) + 1;
if (hlastItem + 1 >= data[firstItem].length) hlastItem = data[firstItem].length - 1;
//position view in users face
view.id = 'view';
view.style.top = (firstItem * dimensions.row) + 'px';
view.style.left = (hfirstItem * dimensions.data) + 'px';
var div;
//add the items
for (var index = firstItem; index <= lastItem; ++index) {
div = document.createElement('div');
var curData = data[index].slice(hfirstItem, hlastItem);
div.innerHTML = '<div class="rowHeader">' +
curData.join('</div><div class="rowData">') +
"</div>";
div.className = "listItem";
div.style.height = dimensions.row + "px";
view.appendChild(div);
}
console.log('viewing items ' + firstItem + ' to ' + lastItem);
}
heightForcer.style.height = (data.length * dimensions.row) + 'px';
heightForcer.style.width = (data[0].length * dimensions.data) + 'px';
if (hidescrollbar) {
//work around for non-chrome browsers, hides the scrollbar
holder.style.width = (holder.offsetWidth * 2 - view.offsetWidth) + 'px';
}
refreshWindow();
function delayingHandler() {
//wait for the scroll to finish
//setTimeout(refreshWindow, 10);
refreshWindow();
}
if (holder.addEventListener) holder.addEventListener("scroll", delayingHandler, false);
else holder.attachEvent("onscroll", delayingHandler);
}
return $matrix;
}());
new $matrix(undefined, document.getElementById('listHolder'), false, {
header: "150px",
data: "90px",
headerColumns: 2
});
私にこれを手伝ってください。
他の人もアイデアを得るためにコメントを投稿してください。そして、この質問を閉じるためにjavascriptと投票を知らない人のために、これはJSの質問です。 JQueryは言語だとは思わないでください.Javascriptは言語です。 – Exception