Extjs 使用 checkboxgroup 时无法获取到 group 中控件的问题

配置如下:

{
	fieldLabel: '角色选择',
	xtype: 'checkboxgroup',
	items: [
		{boxLabel: '测试1', name: 'f1'},
		{boxLabel: '测试2', name: 'f1'},
		{boxLabel: '测试3', name: 'f3'}
	]
}

然后用 formPanel.getForm().findField(‘f1’) 获取控件 f1,返回为 null。
我用的是 Ext 3.2,好像 Ext 2 也有这个问题。

解决方法:
给 Ext 打个补丁:

Ext.override(Ext.form.BasicForm, {

    findField : function(id){
        var field = this.items.get(id);

        if(!field){
            // --------- It was: ---------
            // //Iterate through children on first level
            // this.items.each(function(f){
            //     if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
            //         field = f;
            //         return false;
            //     }
            // });

            // --------- It is now: ---------
            // Iterate through children on all levels
            var fn = function(f) {
              if(field)
                return false;   //stop iteration, if field was found already

              if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
                field = f;    // field was found
                return false;
              }
              else if(f.items) {
                f.items.each(fn);   // iterate through child items
              }
            }
            this.items.each(fn);
            // --------- End of my changes ---------

        }

        return field || null;
    }

});

参考这里:
http://www.extjs.com/forum/showthread.php?44199-2.2-CheckboxGroup-Struggling-with-item-search&p=209958

— EOF —

JS判断是页面中是否出现了滚动条

先做点儿题外话……

最近比较懒,日志基本没有更新呵呵,这篇算是应付吧。

 

判断方法:

当可视区域小于页面的实际高度时,判定为出现滚动条,即:

if (document.documentElement.clientHeight < document.documentElement.offsetHeight) scroll = true;

要使用 document.documentElement ,必须在页面头部加入声明:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

应付完毕……

貌似我的DreamHost空间要到期了,自己有服务器,就不想花钱续了。

–EOF–

Python 下的 ip2long 和 long2ip

PHP 提供了 ip2long 和 long2ip 两个函数,实现了 IP 字符串与其对应整型值之间的转换。而在 Python 中没有类似的函数,所以自己实现了一下,很简单:

import socket
import struct

def ip2long(ipstr):
    return struct.unpack("!I", socket.inet_aton(ipstr))[0]

def long2ip(ip):
    return socket.inet_ntoa(struct.pack("!I", ip))

测试:

>>> ip2long(‘127.0.0.1’)
2130706433
>>> long2ip(2130706433)
‘127.0.0.1’

— EOF —

IFRAME 间操作外部对象导致 Opera 崩溃

以下崩溃现象在 Opera 9.6 和 Opera 10.0 beta 版本中均有出现,而在 IE6/7、Firefox2/3、Chrome 中均测试正常。

下面来看这个案例:

在一个页面中嵌入了两个 IFRAME,一个 IFRAME 中显示 FLASH,另一个 IFRAME 中放置监控 FLASH 的代码:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title> Demo </title>
<script type=”text/javascript” src=”swfobject.js”></script>
</head>

<body>
<iframe id=”flashw” name=”flashw” src=”flash.html” style=”width:200px;height:200px;”></iframe>
<iframe src=”monitor.html” style=”width:200px;height:200px;”></iframe>
</body>
</html>

flash.html:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title> Demo </title>
<script type=”text/javascript” src=”swfobject.js”></script>
</head>
<body>
<div id=”flashzone”></div>
<script type=”text/javascript”>
window.onload=function(){
    var so = new SWFObject(‘flash.swf’, “flash”, “100”, “100”, “9”, “#FF6600”);
    so.addParam(“allowscriptaccess”, “always”);
    so.write(‘flashzone’);
};
</script>
</body>
</html>

monitor.html:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title> Demo </title>
</head>
<body>
Status:<input id=”status” type=”text” value=”” />

<script type=”text/javascript”>
var f, t;

window.onload=function(){
        t=setInterval(function(){
            try{
                f=parent.flashw.document.getElementById(‘flash’);
                if(!f)return;
                if(!f.getStatus)return;
                clearInterval(t);
                setInterval(function(){
                    try{
                        document.getElementById(‘status’).value=f.getStatus();
                    }catch(e){}
                }, 10);
            }catch(e){}
        }, 100);

};
</script>
</body>
</html>

在监控器 IFRAME 中,不断检测并显示 Flash 的状态,其中 f.getStatus() 是调用 flash 对象的一个方法。

接着在 Opera 中不断刷新页面,就会发生类似“应用程序故障”的问题,Opera 崩溃退出。

通过和网友的讨论,发现问题可能是由于 Opera 对资源释放判断不够完善,导致在页面 unload 时 setInterval 线程还在引用已释放的对象,也就是引用了一个空指针造成的。

解决这个问题,只需要把 setInterval 交给资源所在的窗体来管理即可。将以上 monitor.html 改成以下代码就可以了:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title> Demo </title>
</head>
<body>
Status:<input id=”status” type=”text” value=”” />

<script type=”text/javascript”>
var f, t;

window.onload=function(){
        t=parent.flashw.setInterval(function(){
            try{
                f=parent.flashw.document.getElementById(‘flash’);
                if(!f)return;
                if(!f.getStatus)return;
                clearInterval(t);
                parent.flashw.setInterval(function(){
                    try{
                        document.getElementById(‘status’).value=f.getStatus();
                    }catch(e){}
                }, 10);
            }catch(e){}
        }, 100);

};
</script>
</body>
</html>

注意,这里指的资源是指类似 Flash 之类的外联的资源,对其它 IFRAME 的 DOM 的操作不会发生崩溃。

— EOF —

IE7 下 IFRAME 滚动条无法滚动的 BUG

要让 IFRAME 隐藏滚动条,通常的做法就是在嵌入  IFRAME 的页面的 CSS 中指定以下规则:

html, body {overflow: hidden}

如果只是想隐藏横向滚动条,则使用以下代码:

html, body {overflow-x: hidden}

以上代码在 IE、Firefox、Opera、Chrome 下均能正常工作。但是我发现在 IE7 下隐藏横向滚动条时,虽然有显示纵向滚动条,但鼠标滚轮无法使用。似乎 IE7 把 overflow-y 也当成了 hidden。

碰到这种情况,显式指定一下 overflow-y 即可,如:

html, body {overflow-x: hidden; overflow-y: auto;}

或者:

html, body {overflow: auto; overflow-x: hidden;}

— EOF —