• Sep 19, 2011

    position:relative的bug - [div css]

    今天碰到奇怪的问题position:relative的li,在margin:0;

    padding:0时li与li之间存在间距。纠结好久后来发现在li加vertical-align:top解决。疯了!

  • Jun 7, 2011

    php H:i:s 时间差 - [php]

    php 设置cookies或其它需要时间显示时。时间在H部分显示的有问题,解决方法是:

    1、文件开头加 ini_set("date.timezone","Asia/Chongqing");

    2、修改php.ini,增加下面的内容:

    [Date] ; Defines the default timezone used by the date functions date.timezone = Asia/Chongqing

     

  • 在使用js过程中,我们常常需要判断一个对象是否存在。使用jQuery判断元素是否存在,非常的简单。对于一个jQuery对象,我们只需要用length属性即可判断元素是否存在。

    < div id="divBody" >
         < div id="divTest" >< /div >
    < /div >

    上边是简单的html代码。

    jQuery(document).ready(function () {

         if (jQuery ("#divTest" ).length > 0 ) {

              jQuery("//www.google.com.hk/intl/zh-CN/images/logo_cn.png"" />").appendTo("#divTest");

         } else {

               if (jQuery("#divBody" ).length) {

               jQuery("#divBody" ).append("//www.google.com.hk/intl/zh-CN/images/logo_cn.png" />"); }

         }

    });

    上边的代码展示了如何判断对象是否存在。

  • JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素。

    事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。

    目标元素: 任何一个事件的目标元素都是最开始的那个元素,在我们的这个例子中也就是按钮,并且它在我们的元素对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以很方便地得知这个事件是从哪个元素开始的。

    事件的冒泡和捕获

    捕获是从上级元素到下级元素,冒泡是从下级元素到上级元素.

    在IE中,每个元素和window对象都有两个方法:attachEvent()和detachEvent()。attachEvent()用来给一个事件附加事件处理函数。而detachEvent()用来将事件处理函数分离出来。Eg.

    var fnClick = function() {
    alert(“Clicked!);
    }
    var oDiv = document.getElementById(“div1”);
    oDiv.attachEvent(“onclick”, fnClick);
    oDiv.detachEvent(“onclick”, fnClick);

    事件的冒泡有什么好处呢?

    想象一下现在我们有一个10列、100行的HTML表格,你希望在用户点击表格中的某一单元格的时候做点什么。比如说我有一次就需要让表格中的每一个单元格在被点击的时候变成可编辑状态。如果把事件处理器加到这1000个单元格会产生一个很大的性能问题,并且有可能导致内存泄露甚至是浏览器的崩溃。相反地,使用事件代理的话,你只需要把一个事件处理器添加到table元素上就可以了,这个函数可以把点击事件给截下来,并且判断出是哪个单元格被点击了。

    代码很简单,我们所要关心的只是如何检测目标元素而已。比方说我们有一个 table元素,ID是“report”,我们为这个表格添加一个事件处理器以调用editCell函数。editCell函数需要判断出传到table 来的事件的目标元素。考虑到我们要写的几个函数中都有可能用到这一功能,所以我们把它单独放到一个名为getEventTarget的函数中:

    function getEventTarget(e) {
       e = e || window.event;
       return e.target || e.srcElement;
    }

    e这个变量表示的是一个事件对象,我们只需要写一点点跨浏览器的代码来返回目标元素,在IE里目标元素放在srcElemtn属性或event.toElement属性中,而在其它浏览器里则是target或event.relatedTarget属性。

    接下来就是editCell函数了,这个函数调用到了 getEventTarget函数。一旦我们得到了目标元素之后,剩下的事情就是看看它是否是我们所需要的那个元素了。

    function editCell(e) {
       var target = getEventTarget(e);
       if(target.tagName.toLowerCase() === 'td') {
         // DO SOMETHING WITH THE CELL
       }
    }

    在editCell函数中,我们通过检查目标元素标签名称的方法来确定它是否是一个表格的单元格。这种检查也许过于简单了点;如果它是这个目标元素单元格里的另一个元素呢?我们需要为代码做一点小小的修改以便于其找出父级的td 元素。如果说有些单元格不需要被编辑怎么办呢?此种情况下我们可以为那些不可编辑的单元格添加一个指定的样式名称,然后在把单元格变成可编辑状态之前先检查它是否不包含那个样式名称。选择总是多样化的,你只需找到适合你应用程序的那一种。

    事件冒泡的优点和缺点:

    1.那些需要创建的以及驻留在内存中的事件处理器少了。

    这是很重要的一点,这样我们就提高了性能,并降低了崩溃的风险。

    2.在DOM更新后无须重新绑定事件处理器了。

    如果你的页面是动态生成的,比如说通过Ajax,你不再需要在元素被载入或者卸载的时候来添加或者删除事件处理器了。

    潜在的问题也许并不那么明显,但是一旦你注意到这些问题,你就可以轻松地避免它们:你的事件管理代码有成为性能瓶颈的风险,所以尽量使它能够短小精悍。

    不是所有的事件都能冒泡

    blur、focus、load和unload不能像其它事件一样冒泡。事实上blur和focus可以用事件捕获而非事件冒泡的方法获得(在IE之外的其它浏览器中)。

    需要注意的是:

    如果你的代码处理mousemove事件的话你遇上性能瓶颈的风险可就大了,因为mousemove事件触发非常频繁。而mouseout则因为其怪异的表现而变得很难用事件代理来管理。

    如何避免事件冒泡:

    1.方法

    Untitled

    2.方法

    在IE下解决问题很简单,用onMouseEnter、 onMouseLeave来代替onMouseOver、onMouseOut就行了,他们的作用基本相同,前者不会发生冒泡。但是 firefox下没有这两个事件.

    3.方法:

    window.event.cancelBubble = true (IE)   event.stopPropagation()  event.preventDefault() (Firefox)

    阻止jQuery事件冒泡

    jQuery对DOM的事件触发具有冒泡特性。有时利用这一特性可以减少重复代码,但有时候我们又不希望事件冒泡。这个时候就要阻止 jQuery.Event冒泡。

    jQuery.Event的文档中的开头得知,jQuery.Event对象是符合W3C标准的一个事件对象,同时jQuery.Event免去了检查兼容IE的步骤。

    jQuery.Event提供了一个非常简单的方法来阻止事件冒泡:event.stopPropagation();

    $("p").click(function(event){
         event.stopPropagation();
         // do something
    })

    但是这个方法对使用live绑定的事件没有作用,需要一个更简单的方法阻止事件冒泡:return false;

    $(this).after("Another paragraph!");
    return false;  });
    原文地址:http://www.imwls.com/about-javascript-jquery-event-propagation/
  • 今天调试某页面样式,发现chrome下出现问题,但是同样基于webkit引擎的safari没有问题,很是郁闷。于是寻找针对google chrome 的hacks解决方案,网上先搜索了一把,得到的答案基本是一样的,如这篇文章http://www.zeroz.cn/blog/archives/162/,但是自从firefox3.5发布后这个hack就不太灵验了,因为FF 3.5也开始识别nth-of-type了。 
      于是继续苦找,发现了一个针对webkit的hacks:  
    @media screen and (-webkit-min-device-pixel-ratio:0) { 
    /* 针对Google Chrome、Safari 3.0、Opera 9 的CSS样式 */ 


      这样的hacks同样是被Google Chrome、Safari 3.0、Opera 9 所识别的,这还是不能根本解决我的问题。但是仔细查看这篇文章,发现了“另有一种通过附加#的Css hack对chrome无效,可能是Webkit版本不同。”这句话,于是算是变通的找到了一个解决办法。我的代码是要将chrome的字体设置为宋体,其它浏览器仍然使用默认设置的字体。 

    @media screen and (-webkit-min-device-pixel-ratio:0) { 
      .parent-cat li{font-family:’宋体’} 
      .parent-cat li{font-family:inhert;#} 
    }
      在设置完针对google chrome的样式后,再通过css inhert + # hacks即可达到我们的目标。