(摘)
最近在用dhtmlx畫介面,遇到不少鬱悶的問題。中文資料少得出奇。。。
線上文檔也不夠詳細。還好他們有個論壇,而且論壇的搜尋功能做得還行。
1. grid
header中的#master_checkbox,會自動產生一個全選/全不選的checkbox,
本來是個很方便的功能,但是卻有一個致命問題:
gird在current_page為第一頁的時候,翻到第二頁,這時兩頁的資料全部緩衝在用戶端了,點擊#master_checkbox之後,這兩頁的checkbox全部被選中了。。。。。。
Master checkbox will affect only rows which is already loaded to the client side.
我只想選中當前頁面的checkbox哇。
只好去改原始碼 ext/dhtmlxgrid_filter.js:
原來的代碼是這樣的
dhtmlXGridObject.prototype._in_header_master_checkbox = function(t, i, c) {
t.innerHTML = c[0] + "<input type='checkbox' />" + c[1];
var self = this;
t.firstChild.onclick = function(e) {
self._build_m_order();
var j = self._m_order ? self._m_order[i] : i;
var val = this.checked ? 1 : 0;
self.forEachRow(function(id) {
var c = this.cells(id, j);
if (c.isCheckbox())
c.setValue(val)
});
(e || event).cancelBubble = true
}
};
forEachRow()也是會遍曆到所有本機快取的row。
改成這樣的:
dhtmlXGridObject.prototype._in_header_master_checkbox = function(t, i, c) {
t.innerHTML = c[0] + "<input type='checkbox' />" + c[1];
var self = this;
t.firstChild.onclick = function(e) {
self._build_m_order();
var j = self._m_order ? self._m_order[i] : i;
var val = this.checked ? 1 : 0;
/**
* huarong@masalife.com 2010 11 27
* to check/uncheck checkboxes only in the current page.
self.forEachRow(function(id) {
var c = this.cells(id, j);
if (c.isCheckbox())
c.setValue(val)
});
**/
var state=self.getStateOfView();
for (var k=state[1]; k<state[2]; k++){
var c=self.cellById(self.getRowId(k),j);
if (c.isCheckbox()) c.setValue(val);
}
/**
* end..
*/
(e || event).cancelBubble = true
}
};
2 還是關於#master_checkbox的問題。
比如在當前頁做了全選,然後翻頁,再翻回來,會發現checkbox仍然是選中狀態。
應該在翻頁的時候,清除所有checkbox的選中狀態,master_checkbox的選中狀態也要被清除。
mygrid.attachEvent("onBeforePageChanged", clearCheckedRows);
/**
* 翻頁時
* 清除checkbox的選中狀態
* 清除master_checkbox的選中狀態
*
* @return true. 如果返回false會導致翻頁的動作沒有進行。
*/
function clearCheckedRows()
{
mygrid.checkAll(false);
$("#mygrid_container").find("input").each(function(index){
if ($(this).attr("type") == "checkbox")
{
if ($(this).attr("checked"))
$(this).attr("checked", false);
}
});
return true;
}
注意這個函數一定要返回true,否則就沒辦法翻頁了。
3. dhtmlx的window,挺好用的。
突然發現window裡面的頁不執行js……
原來attachURL有二種調用方式:
attachURL(url, true);
這種是ajax方式,視窗中的頁面不執行js。
attachURL(url);
這種是iframe方式,可以執行js………
4. combobox怎樣做readonly
combo_zone1 = new dhtmlXCombo("combo_zone1", "alfa1", 90);
combo_zone1.readonly(1);
而且不能再使用enableFilteringMode(true);
5. 這次是關於JQuery的
The :input selector basically selects all form controls: input, textarea, select and button elements
6. combobox filter的時候,調用的url是怎樣的?
combo_zone1.enableFilteringMode(true,'./combo.php', true);
//實際的URL為:combo.php?pos=0&mask=a&a_dhx_rSeed=1290654577000
//mask就是關鍵詞。
7. grid不使用dynamic paging或者smart rendering的時候,
會把所有的資料都載入到用戶端,翻頁操作完全在本地,不與伺服器互動。
如果要dynamic分頁,比如每次只返回5頁資料給grid,
grid會在翻頁動作時,自動附加二個參數: posStart 與 count,
在sql裡面可以直接當作 LIMIT posStart, count 來用。
這樣的話,grid怎樣才能知道總的頁數呢?
在返回的xml中,
rows行裡面額外加上了二個參數:
<rows total_count="4000" pos="1000">
......
</rows>
total_count是總記錄數,
pos就是posStart
……然後grid會拿4000除以pagesize,就得出總頁數了。。。
這裡再提一下,如果採用分頁的toolbar皮膚,它會顯示一個下拉框,
裡面是下拉形式的第一頁,第二頁。。。第N頁。
如果你的GRID一共有10000頁。。。這個下拉框就會有10000個下拉的選項。。
我當時測試的GRID50萬頁,結果IE狂吃記憶體啊,單核CPU 100%,查了好久才發現是它的問題。
只能在dhtmlx grid的源碼中把這個下拉框去掉!!!
8 grid setColAlign()無效。。。
所有的欄位都是靠左對齊的。
查看了一下代碼,發現dhtmlx產生出的代碼是:
<TD title=649 valign=middle align=right _cellIndex="2" _clearCell="false" _title="true">649</TD>
這段代碼沒什麼問題。。。
問題在於我的css中,寫了一個
TD
{
padding: 0px;
border: 0px;
text-align: left;
}