标签为 "WEB" 的存档

HTML不常用标签属性备忘

<input type=”text” /> autocomplete打开或者关闭自动完成功能。

<a hideFoucs=”fasle”> 不显示focus虚线,只对IE有效。标准浏览器用CSS样式 outline: none;

Mootools Bug – Date.getWeek

mootools-1.2.2.1-more.js

 getWeek: function(){
  var day = (new Date(this.get('year'), 0, 1)).get('date');//应该为get('day');
  return Math.round((this.get('dayofyear') + (day > 3 ? day - 4 : day + 3)) / 7);
 },

mootools-1.2.3.1-more.js

 getWeek: function(){
  return (this.get('dayofyear')  / 7).ceil();
 },

这个完全错

WEB前端开发的一些问题备忘

懒得整理了,权当备忘,IE的一些BUG
========================
多语言字体baseline不统一
背景和边框渲染错误,设置zoom:1,触发hasLayout可以解决
IE FLOAT BUG
viewfile
第一个图片比其它的高一个像素。。。
 <ul class=”people-list tidy” style=”margin-left:20px;”>
  <?php for ($i=0; $i<12; ++$i): ?>
  <li>
   <div><img src=”/img/photo_default.gif” /></div>
   <div class=”info”><a class=”font12″ href=”/”>Warren</a></div>
  </li>
  <?php endfor; ?>
 </ul>
 
 <ul class=”people-list tidy” style=”margin-left:20px;”>
  <?php for ($i=0; $i<12; ++$i): ?>
  <li>
   <img src=”/img/photo_default.gif” />
   <a class=”font12″ href=”/”>Warren</a>
  </li>
  <?php endfor; ?>
 </ul>
 
IE6: Whatever:hover只能实现<style></style>标签里的hover样式,CSS文件中的无法实现。
点击hover元素后有时会导致onhover类没有被去除
 
8以下版本的IE在渲染非ASCII字符时是不考虑字体的baseline的。直接将区域顶部与字体顶部对齐,这是导致我们做中文布局要是对不齐的根本原因。IE8解决了这个问题。
 
div被图片挡住

javascript中new function()的返回值(并不一定是function的“实例”)

今天看mootools的Element源码时发现,Elenment的initialize有返回值,有点不解,initialize有返回值的话那么var div = new Element(‘div’)的话div究竟是initialize的返回值还是一个Element实例。或许有的人会说,当然是Element实例啦。但是,虽然表面上看上去,div似乎是一个Element实例,然而事实上div不是一个Element实例,它是document.createElemetnt(‘div’),然后通过复制Element的prototype到div而来的。下面是Element的部分源码

var Element = new Class({
    initialize: function(el){
        if ($type(el) == 'string') el = document.createElement(el);
        return $(el);
    }

});

function $(el){
    if (!el) return false;
    if (el._element_extended_ || [window, document].test(el)) return el;
    if ($type(el) == 'string') el = document.getElementById(el);
    if ($type(el) != 'element') return false;
    if (['object', 'embed'].test(el.tagName.toLowerCase()) || el.extend) return el;
    el._element_extended_ = true;
    Garbage.collect(el);
    el.extend = Object.extend;
    if (!(el.htmlElement)) el.extend(Element.prototype);
    return el;
};

上面的代码似乎说明了,只要new function()的function有返回值的话那么就应该返回function返回值,但是事实上呢?看下边的例子

function fn()
{
    this.k = 1;
    return 1;
}
fn.prototype = {
    j: 0
};
var f = new fn();  //  f = {}

结果出乎意料,竟然是fn的实例({k:1, j:0});为什么又是function的实例了?继续看下面的实验,在fn中分别return各种数据类型的值,得出一下结果

return 1;                   f = {"j":0,"k":1}
return false;               f = {"j":0,"k":1}
return true;                f = {"j":0,"k":1}
return "string";            f = {"j":0,"k":1}
return null;                f = {"j":0,"k":1}
return undefined;           f = {"j":0,"k":1}


注:Boolean在IE和FIREFOX似乎只要声明而没有定义,不管传入的是true还是false,返回的都是{},而且没有ToString()等方法。而且它的prototype也是{} 。其他浏览器没试过,还不清楚。不过估计也是一样的吧。

[修正]Boolean是有定义的,ToString()应该是toString();

实验的结论很明显,如果function的返回值是对象的话则返回该对象,否则返回function的实例

javascript真是一门神奇的语言,容易入门,但是其中的细节和一些技巧却不是一时半会能掌握,每次回过头学都能学到一些新的东西,好像怎么都学不完,继续加油。

return new Number(1); f = 值为1的Number对象
return new String(“string”); f = 值为”string”的String对象
return new Boolean(true); f = {}
return [1]; f = [1]
return new Object(); f = {}

PHP输出缓存控制

有时我们需要页面内容完成生成后一次性输出,或者echo之后马上输出页面内存而不缓存,那么我们就会用到PHP的页面输出缓存控制的相关函数。

PHP页面输出缓存控制函数如下:

flush — 刷新输出缓冲
ob_clean — Clean (erase) the output buffer
ob_end_clean — Clean (erase) the output buffer and turn off output buffering
ob_end_flush — Flush (send) the output buffer and turn off output buffering
ob_flush — Flush (send) the output buffer
ob_get_clean — Get current buffer contents and delete current output buffer
ob_get_contents — Return the contents of the output buffer
ob_get_flush — Flush the output buffer, return it as a string and turn off output buffering
ob_get_length — Return the length of the output buffer
ob_get_level — Return the nesting level of the output buffering mechanism
ob_get_status — Get status of output buffers
ob_gzhandler — ob_start callback function to gzip output buffer
ob_implicit_flush — Turn implicit flush on/off
ob_list_handlers — List all output handlers in use
ob_start — Turn on output buffering
output_add_rewrite_var — Add URL rewriter values
output_reset_rewrite_vars — Reset URL rewriter values

更加详细的用法见PHP用户手册,下面举一个简单的示例:

$str = 'Hello world';
echo $str;
sleep(10);

这段代码会在sleep了10秒后在页面打印 Hello world。在看下面这段代码:

$str = 'Hello world';
echo $str . str_repeat(' ', 256);
ob_flush();
flush();
sleep(10);

这段代码则会马上在屏幕上打印 Hello world。关键就在于第2和第3行调用的两个函数 ob_flush() 和 flush()。这两个函数得一起使用才能保证页面马上输出Hello world。其中str_repeat(‘ ‘, 256)则是为了解决某些浏览器必须在接收到256个字符后才会显示内容。下面的内容摘自《PHP用户手册》,很好地解释了上面的代码意图。
引用自《PHP用户手册》的内容

flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

上面的代码演示了即时输出缓存,一般情况下该部分代码都能正常完成所要的功能,但是也会有例外

1)服务器打开了gzip等压缩功能,导致输出的缓存被压缩后不足256字节,那么在某些版本IE中也会等到凑够了256字节才输出内容(PS:之所以说某些版本的IE是因为我现在用的IE6就没有该问题,WINDOWS XP SP2)

2)如果这段代码之前还有代码,而且前面的代码中多次调用了ob_start()而ob_end_flush()调用的次数比ob_start()少2次,那么这上面的代码也不能正常工作。因为ob_start()的buffer是stackable的。调用多次ob_start()后,ob_flush()只会把buffer输出到上一层的buffer中。例如

调用ob_start(),它的缓存区为 buffer1,再次调用ob_start(),它的缓存区为buffer2。这时调用ob_flush()只会把 buffer2中的内容输出到 buffer1。这时如果调用 ob_end_flush(), 那么buffer2中的内容会被输出到 buffer1并且销毁buffer2。此时再调用ob_flush()就会把buffer1中的内容输出到服务器,然后调用flush()则可以把服务器中的buffer输出到客户端浏览器。

知道了ob_start()和ob_end_flush()的用法后,就可以用下面的代码来实现所有页面内容完全生成后一次性输出所有的缓存。

ob_start();

//do something to generate $content
echo $content;

ob_end_flush();
flush(); //if script is ending, this can be removed.

之所以要这么做是因为服务器会在缓存区满了以后就输出缓存而不是等到所以页面内容生成后再输出