2013年2月25日星期一

【转】iframe父子兄弟之间通过jquery传值(contentWindow && parent)

摘自:http://www.ablanxue.com/prone_2877_1.html

   iframe父子兄弟之间通过jquery传值(contentWindow && parent),iframe的调用包括以下几个方面:(调用包含html dom,js全局变量,js方法)
主页面调用iframe;
iframe页面调用主页面;
主页面的包含的iframe之间相互调用;
主要知识点
1:document.getElementById("ii").contentWindow 得到iframe对象后,就可以通过contentWindow得到iframe包含页面的window对象,然后就可以正常访问页面元素了;
2:$("#ii")[0].contentWindow  如果用jquery选择器获得iframe,需要加一个【0】;
3:$("#ii")[0].contentWindow.$("#dd").val() 可以在得到iframe的window对象后接着使用jquery选择器进行页面操作;
4:$("#ii") [0].contentWindow.hellobaby="dsafdsafsdafsdafsdafsdafsadfsadfsdafsadfdsaffdsaaaaaaaaaaaaa"; 可以通过这种方式向iframe页面传递参数,在iframe页面window.hellobaby就可以获取到值,hellobaby是自定义的变量;
5:在iframe页面通过parent可以获得主页面的window,接着就可以正常访问父亲页面的元素了;
6:parent.$("#ii")[0].contentWindow.ff; 同级iframe页面之间调用,需要先得到父亲的window,然后调用同级的iframe得到window进行操作;
main.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示图表</title>
<script src="http://www.ablanxue.com/js/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
    var gg="dsafdsafdsafdsafsdaf";
    function ggMM() {
        alert("2222222222222222222222222222222");
    }
    function callIframeMethod() {
        //document.getElementById("ii").contentWindow.test();
        $("#ii")[0].contentWindow.test(); //用jquery调用需要加一个[0]
    }
    function callIframeField() {
        alert($("#ii")[0].contentWindow.ff);
    }
    function callIframeHtml() {
        alert($("#ii")[0].contentWindow.$("#dd").val());
        //alert($("#ii")[0].contentWindow.document.getElementById("dd").value);
        //alert($("#ii")[0].contentWindow.document.getElementById("dd").value);             
    }   
    function giveParameter() {
        $("#ii")[0].contentWindow.hellobaby="dsafdsafsdafsdafsdafsdafsadfsadfsdafsadfdsaffdsaaaaaaaaaaaaa";
    }
</script>
</head>
<body>
    <a href="#" onClick="giveParameter();">参数传递</a>
    <a href="#" onClick="callIframeMethod();">调用子iframe方法</a>
    <a href="#" onClick="callIframeField();">调用子iframe变量</a>
    <a href="#" onClick="callIframeHtml();">调用子iframe组件</a></br>  
    <iframe id="ii" src="frame.htm" width="100%" frameborder="0"></iframe>
    <iframe id="new" src="newFrame.htm" width="100%" frameborder="0"></iframe>
</body>
</html>
frame.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示图表</title>
<script src="http://www.ablanxue.com/js/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
var ff="adfdasfdsafdsafdsaf";
function test() {
    alert($("#dd").val());
}
function callMainField() {
    alert(parent.gg);
}
function callMainMethod() {
    parent.ggMM();
}
function callMainHtml() {
    alert(parent.$("#ii").attr("id"));
}
function getParameter() {
    alert(window.hellobaby);
}
</script>
</head>
<body>
    <a href="#" onClick="getParameter();">接受参数</a>
    <a href="#" onClick="callMainMethod();">调用子iframe方法</a>
    <a href="#" onClick="callMainField();">调用主窗口变量</a>
    <a href="#" onClick="callMainHtml();">调用子iframe组件</a>   
    <input id="dd" type="text" value="http://www.ablanxue.com"/>
</body>
</html>
兄弟iframe页面 newIframe.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示图表</title>
<script src="http://www.ablanxue.com/js/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
function callLevelFrame() {
    var ff=parent.$("#ii")[0].contentWindow.ff;
    alert(ff);
}
</script>
</head>
<body>
<a href="#" onClick="callLevelFrame();">调用兄弟iframe</a>   
<input id="nn" type="text" value="sdafsdfsa"/>
</body>
</html>

【转】关于Iframe之间以及与父窗体的值传递

摘自:http://blog.csdn.net/discussing/article/details/6599566

自己实现过了的,javascript脚本关于Iframe之间以及与父窗体的值传递,事件调用问题;

在父页面访问Iframe子窗体的txtAddress控件
window.frames["ifrMapCompanyDetails"].document.all("txtAddress").value = '地址' ;
   

在Iframe子窗体1访问父页面的TextBox1控件 , 子窗体1把值赋给子窗体2的某个控件
string strValue = "从子窗体传递给父页面的值" ;
下面是在Page_Load事件里面调用的,当然可以写在javascript脚本里面
this.Response.Write("<script>parent.document.all('TextBox1').value = '" + strValue + "';</script>");
this.Response.Write("<script>if( parent.document.all('TextBox2').value = '0')parent.document.all('TextBox1').value = '44';</script>");
  

在Iframe子窗体1访问子窗体2的txtAddress控件 子窗体1把值赋给子窗体2的某个控件  
window.parent.frames["ifrMapCompanyDetails"].document.all("txtAddress").value = '地址' ;


父窗体提交两个Iframe子窗体
 window.frames["ifrMapCompanyDetails"].Form1.submit(); 
 window.frames["ifrMapProductInfoDetails"].Form1.submit();

Iframe子窗体 调用父页面的javascript事件
window.parent.XXX()

 //父页面调用当前页面中IFRAME子页面中的脚本childEvent
function invokechildEvent() 
{ var frm = document.frames["ifrChild1"].childEvent(); }
或者调用当前页面中第一个IFRAME中的脚本childEvent
{ var frm = document.frames[0]; frm.childEvent(); }

//子页面调用父窗体的某个按钮的按钮事件
window.parent.Form1.btnParent.click()

父页面调用子窗体的某个按钮的按钮事件
window.frames['ifrChild1'].document.all.item("btnChild3").click();

有点乱,以后找个时间整理看看.

【转】PHP调试利器XDebug的安装与使用

摘自:http://www.phperzone.cn/portal.php?mod=view&aid=23


很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数)。那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢?

在我们平时的php开发中,一个大的项目经过长时间的积累以后你会发现性能越来越慢,而性能到底消耗在了什么地方,常常是一个令人头疼的问题,function a()调用了多少次,function b()又消耗了多少时间,我们到底怎么查找是哪个蛀虫拉慢了我们的程序运行速度呢?在这里给大家介绍一款工具xdebug,相信很多人已经听说过了,希望借助这个工具我们可以起到简单分析php程序性能瓶颈的问题。

XDebug是什么

XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。

安装XDebug

  1. 访问 www.xdebug.org ,下载php_xdebug.dll,根据版本号与自己的操作系统、PHP版本下载合适的。
  2. 将下载的php_xdebug.dll放到PHP的安装目录php\ext下。
  3. 编辑php.ini,有些集合环境已自带xdebug的配置,如果没有则自己手动加入下面几行:
  4. 1 [xdebug]
    2 zend_extension = "/home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
    3 xdebug.auto_trace = on
    4 xdebug.auto_profile = on
    5 xdebug.collect_params = on
    6 xdebug.collect_return = on
    7 xdebug.profiler_enable = on
    8 xdebug.trace_output_dir = "/home/ad/xdebug_log"
    9 xdebug.profiler_output_dir = "/home/ad/xdebug_log"

    XDebug参数简介:

    • zend_extension 加载xdebug扩展
    • xdebug.auto_trace 自动打开打开函数调用监测
    • xdebug.auto_profile 自动打开性能监测
    • xdebug.trace_output_dir 设定函数调用监测信息的输出文件的路径。
    • xdebug.profiler_output_dir 设定效能监测信息输出文件的路径。
    • xdebug.collect_params 打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。
    • xdebug.collect_return 打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。
  5. 重启Apache。
  6. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。或者去/home/ad/xdebug_log下看看是不是日志已经出来了。

设置选项

CategorySetting Description

 

日志

xdebug.trace_output_dir

日志追踪输出目录
xdebug.trace_output_name日志文件名,xdebug提供了一系列的标识符,生成相应格式的文件名,具体请参考官网
xdebug.trace_options 记录添加到文件中方式:1 = 追加(如果存在该文件). 0 (default) = 覆盖(如果存在该文件)
显示数据xdebug.collect_params 非零值 = 控制function的参数显示选项
  • 0 = 不显示.
  • 1 = 参数类型,值  (例如:array(9)).
  • 2 = 同上1,只是在CLI模式下略微有区别
  • 3 = 所有变量内容
  • 4 = 所有变量内容和变量名(例如:array(0 => 9)).
xdebug.collect_return 1 = 显示function返回值. Default 0 不显示
xdebug.collect_vars1 = 显示当前作用域使用了哪些变量,显示变量名,该选项不会记录变量的值,如果需要,使用xdebug.collect_params
xdebug.collect_assignments 1 = 添加一行显示变量赋值(若为1,形如$a = 1;这类Assignment Expression会在trace文件里显示)
格式 xdebug.trace_format
  • 0 = 人可读. 从左至右每列分别表示:时间点, 内存, 内存差 (需要设置xdebug.show_mem_delta=1), 等级, 函数名,函数参数 (需要设置,xdebug.collect_params=1,只要是非零), 当前代码行所在文件名 , 行号.
  • 1 = 机器可读[1]. 需要借助第三方app,例如:xdebug trace file parser 或者 xdebug trace viewer
  • 2 = html格式 即table,用browser打开,显示table
xdebug.show_mem_delta 1 = 显示每次函数调用内存消耗(内存差)
行为 xdebug.auto_trace 1 = 打开自动追踪. (追踪方式有2种,一种是自动追踪,所有php脚本运行时,都会产生trace文件;另一种是触发方式追踪,如下)
xdebug.trace_enable_trigger[2]

1 = 使用 XDEBUG_TRACE GET/POST 触发追踪, 或者通过设置cookie XDEBUG_TRACE. 为了避免每次请求时,都会生成相应trace追踪文件,你需要把auto_trace设置为0

注:该特性只在2.2+版本才能设置

 [xdebug-general] Re: Is trace_enable_trigger defunct? 

限制xdebug.var_display_max_depth数组和对象元素显示深度:主要用在数组嵌套,对象属性嵌套时,显示几级的元素内容. Default 3.
xdebug.var_display_max_data变量值为字符串时显示多长. Default 512.
xdebug.var_display_max_children数组和对象元素显示的个数. Default 128


一些自定义函数

FunctionDescription
void xdebug_enable()手动打开,相当于xdebug.default_enable=on
void var_dump() 覆写php提供的var_dump,出错时,显示函数堆栈信息,(前提:php.ini里html_errors为1),使用xdebug.overload_var_dump 设置是否覆写
void xdebug_start_trace( 
string trace_file_path 
[, integer options] )
手动控制需要追踪的代码段
trace_file_path :文件路径(相对或绝对,若为空).如果为空,或者不传参, 使用xdebug.trace_output_dir设置的目录
options :
  • XDEBUG_TRACE_APPEND: 1 = 追加文件内容末尾, 0 = 覆写该文件
  • XDEBUG_TRACE_COMPUTERIZED:
    • 2 =同 xdebug.trace_format=1 .
  • XDEBUG_TRACE_HTML: 4 = 输出HTML表格,浏览器打开为一table
void xdebug_stop_trace()停止追踪,代码追踪在该行停止
string xdebug_get_tracefile_name() 获得输出文件名,与 xdebug.auto_trace配合使用.
void xdebug_var_dump([mixed var[,...]]) 输出变量详细信息,相当于php里的var_dump,具体显示请看这里
xdebug.show_local_vars  默认为0,不显示;非零时,在php执行出错时,显示出错代码所在作用域所有本地变量(注:这会产生大量信息,因此默认是closed),具体显示差别如下图[3]
array xdebug_get_declared_vars() 显示当前作用域中已声明的变量
array xdebug_get_code_coverage()显示某一段代码内,代码执行到哪些行[4]

关于xdebug.trace_format=1,如果你使用触发方式启用代码追踪:(xdebug.auto_trace = 0;xdebug.trace_enable_trigger = 1),那么,你可以在URL里添加XDEBUG_TRACE,例如:localhost/test.php?XDEBUG_TRACE,或者localhost//test.php?XDEBUG_TRACE=1(任意值)。

是不是觉得很麻烦,那么装个插件,让它来帮你。Chrome XDEBUG Helper,使用它,你可以切换3种状态,disabled ,debugging enabled,profiling enabled(下篇详细介绍),然后切换到debugging enabled。运行该脚本,(去掉URL里的?XDEBUG_TRACE),就可以代码跟踪了。

使用xdebug_start_trace()和xdebug_stop_trace()可以手动追踪你的代码执行情况。

1 xdebug_start_trace();
2 //your code required to trace
3 xdebug_stop_trace();

设定 xdebug.auto_trace = 1 将在执行所有 PHP 脚本之前先启用自动跟踪。另外,您可以通过代码设定 xdebug.auto_trace = 0,并分别使用 xdebug_start_trace() 和 xdebug_stop_trace() 函数启用和禁用跟踪。但是,如果 xdebug.auto_trace 为 1,则可以在包括配置好的 auto_prepend_file 之前先启动跟踪。

选项 xdebug.trace_ouput_dir 和 xdebug.trace_output_name 用于控制保存跟踪输出的位置。在这里,所有文件都被保存到 /tmp/traces 中,并且每个跟踪文件都以 trace 为开头,后接 PHP 脚本的名称(%s)以及进程 ID(%p)。所有 Xdebug 跟踪文件都以 .xt 后缀结尾。

默认情况下,XDebug 将显示时间、内存使用量、函数名和函数调用深度字段。如果将 xdebug.trace_format 设为 0,则输出将符合人类阅读习惯(将参数设为 1 则为机器可读格式)。此外,如果指定 xdebug.show_mem_delta = 1,则可以查看内存使用量是在增加还是在减少,而如果指定 xdebug.collect_params = 4,则可以查看传入参数的类型和值。要监视每个函数返回的值,请设定 xdebug.collect_return = 1。

本文地址:http://www.nowamagic.net/librarys/veda/detail/2333,欢迎访问原出处。

2013年2月23日星期六

【转】关于设计表时应该注意的问题

如有错误欢迎大家指出。这段时间在家里,做了点修正。
1、慎重选择表名。
有两种选择:
按照多数开发语言的命名规则。比如(myCustomer)。
按照多数开源思想命名规则。比如(my_customer)。
按照咱们中国人的思想。比如(我的客户)。
第一种有个缺点,很容易忘掉大写的字母。
第二种则比较好,每个WORD间用下划线连接,避免遗忘。
第三种建议不要用,虽然很好记。不觉得解析这个表的时候还需要编码转化吗?我个人理解,大家可以补充。
2.  关于编码的设定。
A.             GBK/GB2312.(适用于纯中文存储)。
B.           UTF8.(适用于中英文混合存储)。
C.            LATIN1。(适用于纯英文存储)。
D.     其他的。
3. 关于表引擎的选择。
A.                 MYISAM.(很多人说她的表级锁定会带来好多问题,其实只要设计好对应的表以及写好对应的SQL查询就没有那么大的问题。)
B.                  INNODB. (如果要用到事务,选择她不会错。至于多数人讲的MASTER/SLAVE结构上用INNODBMASTER的选择是否正确,就要看你怎么用了。不能一味的疯狂使用INNODB。除非你想要确保非常高可用性,
C.                  CSV. (以前我写过文章,关于这个引擎。个人觉得最主要的是来存储少量数据以及从EXCELMYSQL的转换方面会很有用。当然只要涉及到规则数据的导入,她就可以办到。)
D.                  BLACKHOLE. (觉得最完美的用处在于MASETR/SLAVE上面,并且MASTER是一个临时的专门负责写的机器。不过缺点也很多,会与MYISAM或者INNODB或者其他的引擎有所冲突,这点自己要做个权衡)。
E.                   MEMORY. (应该说是MYISAM的兄弟了。不过在读内存总比读磁盘的速度要快。不过要注意,它不支持动态数据类型)。
F.                   FEDERATED. (典型的分布式引擎。我以前文章中有介绍。)
G.    NDB。(网络版存储引擎。因为Replication 总是有延迟,所以如果系统容不得任何延迟,就用这个吧。)
   H.    FOLCON。(6.0后用来代替INNODB的引擎。)

I.                  其他旧的以及新开发的引擎具体介绍:http://dev.mysql.com/doc/refman/6.0/en/storage-engines.html)。
4. 关于属性数据类型的选择。
A.                  INT(一个字节的TINYINT,两个字节的SMALLINT,三个字节的MEDIUMINT,四个字节的INT8个字节的BIGINT。记住:UNSIGNED不管你定义或者不定义,都不影响内部的存储字节大小)
B.                   少于10个字符用CHAR是在合适不过了。(不过要记住在MEMORY引擎里面会自动把VARCHAR转化为CHAR)
C.                   我一般用DECIMAL或者NUMERIC来代替FLOAT或者DOUBLE。因为老板要求精确的数字。如果不要求精确的,那就用FLOAT吧。速度快,占空间小。(DECIMAFLOAT(P)是动态存储。比如 :D ECIMAL(10,2)占用5个字节。FLOAT4个字节,)
D.                 BLOBTEXT,VARCHAR(一般存放文章内容,特别是新闻网站。需要的字节数是所存储的字符长度+1。记住BLOB和VARCHAR是TEXT和CHAR的BINARY类型)
E.                   ENUM(在一定范围内绝佳的代替VARCHARCHAR的工具,因为她只占一到两个字节。)
F.                   时间和日期类型(占3个字节的DATE8个字节的DATETIME4个字节的TIMESTAMP3个字节的TIME1个字节的YEAR。)。如果要存储比如‘1983’这样的年份,用YEAR明显比VARCHAR或者CHAR要节省空间。因为后者要占5个字节。
G.                  BOOLEAN(用来存储YES或者NO之类的值,占用一个字节。)
H.                  关于自增字段。目前我们的项目中涉及到好多ORDER BY RAND()操作。此类语句在数据库并发大的时候会造成CPU严重阻塞,持续产生数据库死锁!解决此类问题最好的办法就是利用自增字段,用程序随即生成数字序列,或者在数据库端随即生成数字序列。
I.                    关于ZEROFILL。非常好用的前置填补0的存储,而不是用用对应个数的空串来代替。在需要前置补零的操作中INT ZEROFILL可以用来代替CHAR或者VARCHR
5.  关于默认值。
A.                  5.0之后,只要设定字段为NOT NULL,系统自动给出默认值。对应CHAR->’’,INT->0,BOOLEAN->0等等。
B.                   5.0之前的版本,需要手动指定默认值,否则会出现一定的异常。到时候查都不好查了。
6.  关于多数据库建立。
A.                  应该把对应的业务放在各自不同的数据库里,而不是所有业务放到一个库里面。
B.                   数据库的命名和表命名一样。
7.  关于索引。
A.                  设计表初期尽量考虑到应该建立的索引。所有建立的索引一定要测试一下,看是否有必要,否则会翻倍的减少写数据的性能。
B.                   对于只有存储0或者1的列,尽量干掉索引,单独分出两个表。一个代替0,另外一个代替1。或者在一个字段里面用EMUM或者CHAR(0)或者CHAR(1)来代替。
   PS: 最后一个要值得注意的,就是尽量所有的字段用NOT NULL。虽然MYSQL可以对NULL列进行索引,不过我不建议。