2009年5月2日星期六

阿门_百度百科

阿门[amen]:amen。希伯来语,意思是"真实的",与希伯来语"真理"一词有关。在公众祈祷结束后通常说"我同意"。如果某人不同意,他不必说"阿们"。"耶和华以色列的神是应当称颂的,从亘古直到永远。愿众民都说:阿们!"(诗篇106:48)。在以赛亚书65:16中神两次被描写成阿们的神("真实的神")。新约圣经中希腊字是希伯来语的一种音译,耶稣常用在这个词组中:如在约翰福音5:24,25中"我实实在在地告诉你们"。它还用作一种对耶稣的称呼。耶稣在启示录3:14中说:"那为阿们的,为诚信真实见证的,在神创造万物之上为元首的。"保罗说在耶稣里一切都是放心的:"神的应许,不论有多少,在基督都是是的。所以借着他也都是实在(实在:原文是阿们)的,叫神因我们得荣耀。那在基督里坚固我们和你们,并且膏我们的就是神"(哥林多后书1:20-21)。

谁都知道,“阿门”是全世界基督徒都听得懂的两个语词之一。(另一个是哈利路亚)。因为全世界任何语文的圣经中,都把这两个语词的译音保留下来。并在所有教会的祷告赞美中,很自然地直接应用。所以无论操什么方言语文的基督徒,在任何地方,只要开口呼出阿门(或哈利路亚),人就知道你是一个基督徒了。

“阿门”到底是什么意思呢?

在希伯来文中,“阿门”这个词原来的意思是指“靠得信住reliable,确定sure,真实true”或“愿事情是这样成就so let it be”。旧约圣经中,摩西写律法时,就已应用了“阿门”这个语词。当以色列民众对耶和华律法的要求作出群体性的响应时,就发出阿门为他们心中正面的承诺(民五:22;申廿七:15-26)。以后,先知耶利米,以及尼希米,向百姓重申律法时,也获得类同的反应(耶十一:5;尼五:3)。这种向祈祷中的誓言和律法的咒诅应以阿门的,是愿意负起所承诺的一切后果。旧约诗篇中,作者在祝祷或赞颂前后,加上阿们,是说明自己对祷文或颂词,具有确实的诚意。

新约希腊文的阿门,只是希伯来文的音译。初期教会的基督徒,在聚会中,有人领导祷告时,全众就沿用他们原先在犹太会堂所习惯的,向神诚心地应以阿门。自此,教会信徒都会在祷告后,应声阿们。是对所表达的祷告,真心诚意的向神献上。同时也表示愿意顺服天上神的权柄,以达成神在人身上的意愿。

圣经福音书的记载中,主耶稣常用阿门这个词,是在他开口教训人的时候。他常说:“我实在告诉你们。”这“实在”(verily/truely)原文就是阿门。当主耶稣向人说:“我阿门的告诉你”,他是带着神的权柄讲话。而这“我”字也就刻划出他自己就是神,在马太用了卅一次,马可用十三次,连最不用希伯来词语的路加,(路加福音中从不用“和散那、阿爸、以利、拉比”等这类希伯来词的)也用了六次。路加这样地应用,一定有他明显的用意。而约翰却更隆重地,每次都用两个相联的阿门。中文圣经就译为“我实实在在的告诉你们”(我阿门阿门的告诉你们),共用了廿五次。这样的用法,并非法利赛人和文士敢用的,因为那是带有权柄的。但主耶稣却清楚认识,神的应许将透过他必要应验。约翰在启示录中进一步的指明,这位主耶稣就是阿门(启三:14)。他不但在末世作真实的见证,而且他也正是那位宇宙的创造者。他就是神。正如先知以赛亚也宣布过,这位神确是“真实的神”(the God of Amen)。(赛六十五:16重复两次)。“阿门”乃是神的名称。

保罗书信及希伯来书中把阿门接在祷告和祝福之后,使写信的人为受信的会众(教会的弟兄姊妹)所献上的祝祷,更加肯定,更加有能力。原来祝祷赞颂是带领会众存有敬虔的心到神面前来崇拜。并且在心底里也发出“阿门”作感恩的响应。正为这缘故,保罗就强调,凡在公众祝祷感恩的语言,都必须是大家听得懂的(林前十四:16)。不然,别人怎样与你说阿门呢?为了响应主耶稣再来的应许和盼望,在启示录中也两次用阿门(启廿二:20,一:7),很确切地表达了愿主再临的心愿。

整本圣经对阿门的描述和应用,提醒我们基督徒以虔诚敬拜的心来到神的面前。很肯定的接受神的应许,很真实的诉说我们的心意。又以感恩祝祷的心灵,等候我们主耶稣基督的再临。

"阿门"的意思是"诚如所愿",阿门虽是基督徒在信经宣告、唱诗赞美和祷告中最常用的词,但其在圣经中的本义,似乎已经由于人本主义对教会的侵蚀而被逐渐遗忘了。对于大部分基要主义者和福音派人士来说,阿门的意思就是"我觉得好",这种主观式的以人为中心的态度,在过往的两个世纪中几乎主宰了整个的欧美教会,也直接影响到中国教会。

路斯德尼考察"阿门"一词指出,"阿门"经常是对上帝律法的赞同,在《启示录》中,是与基督见证人身份直接联系在一起的。"基督是阿门,因为他是'为诚信真实见证的',律法是由他宣布的,他也见证一切对律法的冒犯,任何人如果不是在基督的赎罪里接受死刑,他最终就会对那些冒犯律法的人执行死刑。"[7]丘顿在其神学力作中重申:"根据圣经神学,阿门的真正意思是很强烈的。实际上,阿门是一个誓言:说阿门,就是祈求圣约的咒诅临到自己(参考民5:21-22;申27:15-26;尼5:12-13)。作为我们的阿门,基督藉着他完全的顺服,救赎的献祭,在天庭持续的代祷(林后1:20;加3:13;来7:22-28;9:24-28;10:10-14),基督是圣约之应许的保证人。因此,在敬拜仪式中,当我们对上帝的圣言说阿门的时候,既是一个誓言,也是承认我们的救赎并不是依赖我们自己持守圣约,而是完完全全依赖耶稣基督对圣约完全的持守,他亲自代替我们处于圣约的规定之下,代替我们担当了圣约的咒诅。"[8]加尔文高度赞誉主祷文,以为"我们向上帝所当求,或可能求的,都包括在这一祷文里了,这祷文是亲自传授给我们的。基督是天父赐给我们的最好的老师,而且是我们惟有要听从的,因为基督是上帝的永恒智慧;……这一祷告是如此地齐备完全,所以凡有与它的异议不相符或没有关系的,就是不虔、无益,而不为上帝所许可的"[9]。因此,当我们祷告完毕,在说阿门的时候,我们要省察自己:有没有在耶稣基督里与上帝和好?有没有以上帝为本,并以他为乐?有没有以上帝启示的律法为标准?"愿上帝怜悯我们,赐福与我们,用脸光照我们"(诗67:1)。"阿门"是立约的誓言,是我们在上帝面前宣誓要遵行上帝的律法,实在是严肃的事情。我们的祷告虽是与我们在天上的父交通,有基督徒的喜乐和自由,但同时也是严肃的事情。

"当日摩西吩咐百姓说:…不坚守遵行这律法言语的,必受咒诅。百姓都要说:阿门"(申27:11-26)!"你的话是我脚前的灯,是我路上的光。你公义的典章,我曾起誓遵守,我必按誓而行。我甚是受苦,耶和华啊,求你照你的话将我救活。耶和华啊,求你悦纳我口中的赞美为供物,又将你的典章教训我。我的姓名常在危险之中,我却不忘记你的律法。恶人为我设下网罗,我却没有偏离你的训词。我以你的法度为永远的产业,因这是我心中所喜爱的。我的心专向你的律例,永远遵行,一直到底"(诗119:105-112);"你到上帝的殿要谨慎脚步。因为近前听,胜过愚昧人献祭,他们本不知道所作的是恶。你在上帝面前不可冒失开口,也不可心急发言。因为上帝在天上,你在地下,所以你的言语要寡少"

"阿门":Amen这一词据希伯来原文含有"坚定"的意思。在旧约,当人民领受王的命令的时候,说"阿门"表示:遵命(王上1:36);当人民受警戒的时候,说"阿门"表示:领受(民5:22;申27:15-26);当百姓听先知说预言时,说"阿门"表示:诚心所愿(耶28:1-3、5、6)。

因此,新约基督徒在称谢、颂赞、祝福、感谢、祷告神完了的时候,也都要说"阿门"表示:实实在在,但愿如此(罗1:25;9:5;林前14:15-16;加6:18;太6:9-13;林后1:20)。保罗说,神的应许,不论有多少,在基督都是是的,所以藉着他也都是实在的,(原文即"阿门",林后1:20)。是以主耶稣基督自称为诚信真实的,为"阿门" 的。(启3:14)

===========================

"祷告奉耶稣的名,阿们!"、"奇怪,你们基督徒为什么祷告结束时要说阿们呢?常听你们说阿们,到底是什么意思呢?"

这句话几乎是每次祷告词最后的"公式",基督徒也常说阿们,但阿们并不是结束的意思,原是希伯来语,原意为"是,上主"或"盼望是这样"。在旧约圣经中多被用来同意别人的话,不论是祈求或咒诅。它也是宗教礼仪的闭幕词,而在新约圣经中,"阿们"也用在礼仪或经文上,通常被译为"实实在在、确确实实"的意思,用在祷告结尾是请求上帝垂听我们的祷告。而耶稣常说:"我实实在在地告诉你们",所以这是个很慎重的字词。因此,当你们在祷告结尾时,别忘了诚心地求上帝垂听,好好地说:"奉耶稣的名,阿们!"

=====================================

Amen

阿门,M.D.

Mir Amen Dehlavi (1745~1806)

印度乌尔都语作家,原名密尔·阿曼,曾用笔名鲁

特夫发表诗作。出身于德里的穆斯林贵族。1781年迁居

加尔各答,晚年在威廉堡学院任编译员。他的成名作品

是《花园与春天》(1803),取材于民间故事和神话传说。

它写古罗马一皇帝外出私访高人,途中巧遇四个王子出

身的游方僧,各叙身世,由此穿插了寓言、神话和叙述

恋爱、冒险的十几个故事,想象丰富,情节曲折,文笔

生动。它反映了印度莫卧儿王朝时代的社会风貌,德里

的习俗,以及中古时期波斯和阿拉伯的社会制度、风土

人情和文化生活对印度的影响。在语言运用上,它把传

统的波斯语成语、谚语、典故、比喻与印度的民间语言

结合,成为德里标准语,开创了白话文时代,这部作品

至今仍被认为是19世纪乌尔都语的典范。

(李宗华)

阿门

中文意思就是“同心合一”

Come from: http://baike.baidu.com/view/64.htm

2009年4月29日星期三

Events/jQuery.Event

From jQuery JavaScript Library

jQuery's event system normalizes the event object according to W3C standards. The event object is guaranteed to be passed to the event handler (no checks for window.event required). Most properties from the original event are copied over to our wrapper object.

jQuery.Event

The object constructor is exposed and can be used when calling trigger.
You don't need to use the new operator, it is optional.

Check trigger's documentation to see how to combine it with your own event object.

Example:

Create a new jQuery.Event object without the new operator.

var e = jQuery.Event("click"); 


Example:

Create a new jQuery.Event object with the new operator.

var e = new jQuery.Event("click"); 


Attributes

event.type

Describes the nature of the event.

Return value: String
Example:

$("a").click(function(event) {
  alert(event.type);
});
Result:
 "click"


event.target

Contains the DOM element that issued the event.
This can be the element that registered for the event or a child of it.

Fixed where necessary (IE, Safari).

Use to implement event delegation.

Return value: Element
Example:

$("a[href=http://google.com]").click(function(event) {
  alert(event.target.href);
});
Result:
"http://google.com"


Example:

Implements a simple event delegation: The click handler is added to an unordered list, and the children of it's li children are hidden. Clicking one of the li children toggles (see toggle()) their children.

function handler(event) {
  var $target = $(event.target);
  if( $target.is("li") ) {
    $target.children().toggle();
  }
}
$("ul").click(handler).find("li > ").hide();


event.data

Contains the optional data passed to jQuery.fn.bind when the current executing handler was bound.

Return value: Anything
Example:

$("a").each(function(i) {
  $(this).bind('click', {index:i}, function(e){
     alert('my index is ' + e.data.index);
  });
});


event.relatedTarget

On mouse movement, contains the DOM element which the mouse was previously on when moving onto or off of an element.

Fixed where necessary.

Return value: Element
Example:

$("a").mouseout(function(event) {
  alert(event.relatedTarget);
});


event.currentTarget

The current DOM element within the event bubbling phase. This attribute will always be equal to the this of the function.

Return value: Element
Example:

$("p").click(function(event) {
  alert( event.currentTarget.nodeName );
});
Result:
"P"


event.pageX/Y

The pageX/Y property pair returns the mouse coordinates relative to the document.

Fixed where necessary (IE).

Return value: String
Example:

$("a").click(function(event) {
  alert("Current mouse position: " + event.pageX + ", " + event.pageY );
});
Result:
"Current mouse position: 130, 640"


event.result

Will contain the last value returned by an event handler (that wasn't undefined).

Return value: Anything
Example:

$("p").click(function(event) {
  return "hey"
});
$("p").click(function(event) {
  alert( event.result );
});
Result:
"hey"


event.timeStamp

The timestamp (in milliseconds) when the event was created.

Return value: Number
Example:

var last;
$("p").click(function(event) {
   if( last )
      alert( "time since last event " + event.timeStamp - last );
   last = event.timeStamp;
});


Methods

event.preventDefault()

Prevents the browser from executing the default action. Use the method isDefaultPrevented to know whether this method was ever called (on that event object).

Fixed where necessary (IE).

Return value: undefined

Example:

Stops the browser from changing the page to the href of any anchors.

$("a").click(function(event){
  event.preventDefault();
  // do something
});


event.isDefaultPrevented()

Returns whether event.preventDefault() was ever called on this event object.

Return value: true/false

Example:

Checks whether event.preventDefault() was called.

$("a").click(function(event){
  alert( event.isDefaultPrevented() );
  event.preventDefault();
  alert( event.isDefaultPrevented() );
});


event.stopPropagation()

Stops the bubbling of an event to parent elements, preventing any parent handlers from being notified of the event.

Note that this will not prevent other handlers on the same element from running. This method works for custom events triggered with trigger, as well.

Use the method event.isPropagationStopped() to know whether this method was ever called (on that event object).

Fixed where necessary (IE).

Return value: undefined

Example:

Prevents other event handlers from being called.

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


event.isPropagationStopped()

Returns whether event.stopPropagation() was ever called on this event object.

Return value: true/false

Example:

Checks whether event.stopPropagation() was called.

$("p").click(function(event){
  alert( event.isPropagationStopped() );
  event.stopPropagation();
  alert( event.isPropagationStopped() );
});


event.stopImmediatePropagation()

Keeps the rest of the handlers from being executed.
This method also stops the bubbling by calling event.stopPropagation().

Use event.isImmediatePropagationStopped() to know whether this method was ever called (on that event object).

Return value: undefined

Example:

Prevents other event handlers from being called.

$("p").click(function(event){
  event.stopImmediatePropagation();
});
$("p").click(function(event){
  // This function won't be executed
});


event.isImmediatePropagationStopped()

Returns whether event.stopImmediatePropagation() was ever called on this event object.

Return value: true/false

Example:

Checks whether event.stopImmediatePropagation() was called.

$("p").click(function(event){
  alert( event.isImmediatePropagationStopped() );
  event.stopImmediatePropagation();
  alert( event.isImmediatePropagationStopped() );
});


Come from: http://docs.jquery.com/Events/jQuery.Event

JavaScript的事件代理比你想的要简单

如果你想进一步了解如何用JavaScript来为网页添加交互性的话,你也许已经听过JavaScript的事件代理(event delegation)了,并且会觉得只有那些牛逼烘烘的JavaScript程序员才会关心这样复杂的设计模式。事实上,如果你已经知道怎么样去添加JavaScript的事件处理器(event handler),实现事件代理也是件轻而易举的事情。

JavaScript事件是所有网页交互性的根基(我指的是真正的互动性,而不仅是那些CSS的下拉菜单)。在传统的事件处理中,你按照需要为每一个元素添加或者是删除事件处理器。然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越大。JavaScript事件代理则是一种简单的技巧,通过它你可以把事件处理器添加到一个父级元素上,这样就避免了把事件处理器添加到多个子级元素上。

它是怎么运作的呢?

事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素。当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。对任何一个事件来说,其目标元素都是原始元素,在我们的这个例子中也就是按钮。目标元素它在我们的事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地判断出这个事件是从哪个元素开始的。

这对我有什么好处呢?

想象一下现在我们有一个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里目标元素放在srcElement属性中,而在其它浏览器里则是target属性。

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

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

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

有哪些优点和缺点呢?

JavaScript事件代理带来的好处有:

  • 那些需要创建的以及驻留在内存中的事件处理器少了。这是很重要的一点,我们得到了性能上的提升,同时降低了崩溃的风险。
  • 在DOM更新后无须重新绑定事件处理器了。如果你的页面是动态生成的,比如说通过Ajax,你不需要再在元素被载入或者卸载的时候来添加或者删除事件处理器了。

潜在的问题也许并不那么明显,但是一旦你注意到这些问题,你就可以轻松地避免它们:

  • 你的事件管理代码有成为性能瓶颈的风险,所以尽量使它能够短小精悍。
  • 不是所有的事件都能冒泡的。blurfocusloadunload不能像其它事件一样冒泡。事实上blurfocus可以用事件捕获而非事件冒泡的方法获得(在非IE的浏览器中),不过我们改天再说这个吧。
  • 在管理鼠标事件的时候有些需要注意的地方。如果你的代码处理mousemove事件的话你遇上性能瓶颈的风险可就大了,因为mousemove事件触发得非常频繁。而mouseout则因为其怪异的表现而变得很难用事件代理来管理。

总结

已经有一些使用主流类库的事件代理示例出现了,比如说用jQueryPrototype以及Yahoo! UI的。你也可以找到那些不用任何类库的例子,比如说Usable Type blog上的这一个。

在你需要的时候,事件代理将成为你工具箱里一件得心应手的工具,而且它真的很容易实现。

Come from: http://www.yeeyan.com/articles/view/luosheng/24593

Javascript Dump Method

Javascript Dump Method

The Dump method is based on one of the tags available in Coldfusion ( <cfdump>) providing the ability to display simple and complex variables in a user friendly way that is perfect for debugging/inspecting data. There is no way to do this with javascript and often I had wanted a method to do this. This method will do just that allowing for an infinite amount of data nesting complete with color coding for different data types, the ability to show/hide the data's type (String/Number/Boolean/Object/Array/Function), expandable and collapsible tables/keys and cross browser support.

Click on the buttons bellow to see some examples in action, toggle the Show Data Types box to see javascript data typing in action (not possible in Coldfusion).

Thanks to John Wilson for providing the jQuery plugin.

Browser Support

Internet Explorer 6, Internet Explorer 7, Firefox 1.5, Opera 8, Safari 1.2 (Mac), Firefox (Mac) - all tested, should also work in most other browsers

Download

Click here to download the latest version (1.08)
Click here to download the latest jQuery plugin

Usage

dump(value, [showTypes])
@ param value (Any) value to dump
@ param [showTypes] (Boolean) optional to display each key/value's type
@ return (Void) returns nothing

Examples

dump(myObject, true); // opens a dump window displaying key/value types of myObject
dump([123,456,789], false); // opens a dump window not displaying key/value types of the array passed
dump('string value', false); // opens a dump window showing the string value

Come from: http://www.netgrow.com.au/files/javascript_dump.cfm

生如夏花之绚烂,死如秋叶之静美

逝去的绚丽
您的阳光对着我的心头的冬天微笑,
从来不怀疑它的春天的花朵。
---泰戈尔《飞鸟集》


鸟儿愿为一朵云。
云儿愿为一只鸟。
---泰戈尔《飞鸟集》
  


我的昼间之花,落下它那被遗忘的花瓣。
在黄昏中,这花成熟为一颗记忆的金果。
---泰戈尔《飞鸟集》


神希望我们酬答他,在于他送给我们的花朵,
而不在于太阳和土地。
---泰戈尔《飞鸟集》 
 


小花问道:“我要怎样地对你唱,怎样地崇拜你呢?太阳呀?”
太阳答道:“只要用你的纯洁的素朴的沉默。”
---泰戈尔《飞鸟集》


这寡独的黄昏,幕着雾与雨,
我在我的心的孤寂里,感觉到它的叹息。
---泰戈尔《飞鸟集》 


完全”为了对“不全”的爱,把自己装饰得美丽。
---泰戈尔《飞鸟集》


那些把灯背在背上的人,
把他们的影子投到了自己前面。
---泰戈尔《飞鸟集》


心是尖锐的,不是宽博的,
它执着在每一点上,却并不活动。
---泰戈尔《飞鸟集》
 


这面纱等候着在夜间卸去。
---泰戈尔《飞鸟集》


花儿低低的对看花的人说:
“少顾念我罢,我的朋友!
让我自己安静着,开放着,
你们的爱是我的烦扰。”
---冰心《繁星》


“你离我有多远呢,果实呀?”
“我藏在你心里呢,花呀。”
---泰戈尔《飞鸟集》


是为了它那不曾要求,不曾知道,
不曾记得的小小的需要。
---泰戈尔《飞鸟集》


小孩子! 你可以进我的园, 你不要摘我的花
看玫瑰的刺儿, 刺伤了你的手。
---冰心《繁星》


这个渴望是为了那个在黑夜里感觉得到,
在大白天里却看不见的人。
---泰戈尔《飞鸟集》


安静些吧,我的心,这些大树都是祈祷者呀。
---泰戈尔《飞鸟集》


打开门-- 让蓝天没有阻挡地泻进来,
让花的芬芳香进我的房间。
---泰戈尔《打开门》


幼花的蓓蕾开放了, 它叫道:
“亲爱的世界呀,请不要萎谢了。”
---泰戈尔《飞鸟集》


使生如夏花之绚烂,死如秋叶之静美。
---泰戈尔《飞鸟集》

2009年4月28日星期二

IE和Firefox浏览器CSS网页布局不同点

 我们讨论的主题CSS网页布局,最令大家头疼的问题就是浏览器兼容性,虽然webjx.com介绍过很多这方向的知识,但依然让很多开发人员晕头转向,今天的这篇文章,将列出css和javascript在IE和Firefox中二十三个不同点,希望对大家的学习有所帮助。

一、document.formName.item("itemName") 问题 
  问题说明:IE下,可以使用 document.formName.item("itemName") 或 document.formName.elements ["elementName"];Firefox下,只能使用document.formName.elements["elementName"]。
  解决方法:统一使用document.formName.elements["elementName"]。

二、集合类对象问题
  问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。
解决方法:统一使用 [] 获取集合类对象。

三、自定义属性问题
  问题说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。
  解决方法:统一通过 getAttribute() 获取自定义属性。

四、eval("idName")问题
  问题说明:IE下,可以使用 eval("idName") 或 getElementById("idName") 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById("idName") 来取得 id 为 idName 的HTML对象。
  解决方法:统一用 getElementById("idName") 来取得 id 为 idName 的HTML对象。

五、变量名与某HTML对象ID相同的问题
  问题说明:IE下,HTML对象的ID可以作为 document 的下属对象变量名直接使用,Firefox下则不能;Firefox下,可以使用与HTML对象ID相同的变量名,IE下则不能。
  解决方法:使用 document.getElementById("idName") 代替 document.idName。最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var关键字,以避免歧义。

六、const问题
  问题说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量。
  解决方法:统一使用var关键字来定义常量。

七、input.type属性问题
  问题说明:IE下 input.type 属性为只读;但是Firefox下 input.type 属性为读写。
  解决办法:不修改 input.type 属性。如果必须要修改,可以先隐藏原来的input,然后在同样的位置再插入一个新的input元素。

八、window.event问题
  问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。
  解决方法:在事件发生的函数上加上event参数,在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null)
       示例:


<input type="button" onclick="doSomething(event)"/> 
<script language="javascript"> 
function doSomething(evt) { 
var myEvent = evt?evt:(window.event?window.event:null)
... 
}

九、event.x与event.y问题
  问题说明:IE下,even对象有x、y属性,但是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,但是没有x、y属性。
  解决方法:var myX = event.x ? event.x : event.pageX; var myY = event.y ? 
event.y:event.pageY;
  如果考虑第8条问题,就改用myEvent代替event即可。

十、event.srcElement问题
  问题说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。
  解决方法:使用srcObj = event.srcElement ? event.srcElement : event.target;
  如果考虑第8条问题,就改用myEvent代替event即可。

十一、window.location.href问题
  问题说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。
  解决方法:使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。

十二、模态和非模态窗口问题
  问题说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能。
  解决方法:直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。 
  如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话,使用var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。

十三、frame和iframe问题
  以下面的frame为例: 
  <frame src="http://www.webjx.com/123.html" id="frameId" 
name="frameName" /> 
  (1)访问frame对象
  IE:使用window.frameId或者window.frameName来访问这个frame对象;
  Firefox:使用window.frameName来访问这个frame对象;
  解决方法:统一使用 window.document.getElementById("frameId") 来访问这个frame对象;
  (2)切换frame内容
  在IE和Firefox中都可以使用window.document.getElementById("frameId").src = "webjx.com.html"或window.frameName.location = "webjx.com.html"来切换frame的内容;
  如果需要将frame中的参数传回父窗口,可以在frame中使用parent关键字来访问父窗口。

十四、body载入问题
  问题说明:Firefox的body对象在body标签没有被浏览器完全读入之前就存在;而IE的body对象则必须在body标签被浏览器完全读入之后才存在。
  [注] 这个问题尚未实际验证,待验证后再来修改。
  [注] 经验证,IE6、Opera9以及FireFox2中不存在上述问题,单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素,即使这个元素还没有载入完成。

十五、事件委托方法
  问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这之前已被实现;在Firefox下,使用 document.body.onload = inject();
  解决方法:统一使用 document.body.onload=new Function(’inject()’); 或者 document.body.onload = function(){/* 这里是代码 */}
  [注意] Function和function的区别

十六、访问的父元素的区别
  问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。
  解决方法:因为firefox与IE都支持DOM,因此统一使用obj.parentNode 来访问obj的父结点。

十七、cursor:hand VS cursor:pointer
  问题说明:firefox不支持hand,但ie支持pointer ,两者都是手形指示。
  解决方法:统一使用pointer。

十八、innerText的问题.
  问题说明:innerText在IE中能正常工作,但是innerText在FireFox中却不行。
  解决方法:在非IE浏览器中使用textContent代替innerText。
  示例:


if(navigator.appName.indexOf("Explorer") >-1){ 
document.getElementById(’element’).innerText = "my text"; 
} else{ 
document.getElementById(’element’).textContent = "my text"; 


  [注] innerHTML 同时被ie、firefox等浏览器支持,其他的,如outerHTML等只被ie支持,最好不用。

十九、对象宽高赋值问题
  问题说明:FireFox中类似 obj.style.height = imgObj.height 的语句无效。
  解决方法:统一使用 obj.style.height = imgObj.height + ’px’;

二十、Table操作问题
  问题说明:ie、firefox以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。
  解决方法:


//向table追加一个空行: 
var row = otable.insertRow(-1); 
var cell = document.createElement("td"); 
cell.innerHTML = ""; 
cell.className = "XXXX"; 
row.appendChild(cell); 

  [注] 由于俺很少使用JS直接操作表格,这个问题没有遇见过。建议使用JS框架集来操作table,如JQuery。

二一、ul和ol列表缩进问题
  消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px; 
  其中margin属性对IE有效,padding属性对FireFox有效。← 此句表述有误,详细见↓
  [注] 这个问题尚未实际验证,待验证后再来修改。
  [注] 经验证,在IE中,设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点,设置padding对样式没有影响;在Firefox 中,设置margin:0px仅仅可以去除上下的空白,设置padding:0px后仅仅可以去掉左右缩进,还必须设置list-style:none才 能去除列表编号或圆点。也就是说,在IE中仅仅设置margin:0px即可达到最终效果,而在Firefox中必须同时设置margin:0px、 padding:0px以及list-style:none三项才能达到最终效果。

二二、CSS透明问题
  IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。 
  FF:opacity:0.6。
  [注] 最好两个都写,并将opacity属性放在下面。

二三、CSS圆角问题
  IE:ie7以下版本不支持圆角。
  FF: -moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border- radius- bottomright:4px;。
  [注] 圆角问题是CSS中的经典问题,建议使用JQuery框架集来设置圆角,让这些复杂的问题留给别人去想吧。

  关于CSS中的问题实在太多了,甚至同样的CSS定义在不同的页面标准中的显示效果都是不一样的。更多的知识请参考webjx.com的文章。一个合乎发展的建议是,页面采用标准DHTML标准 编写,较少使用table,CSS定义尽量依照标准DOM,同时兼顾IE、Firefox、Opera等主流浏览器。BTW,很多情况下,FF和 Opera的CSS解释标准更贴近CSS标准,也更具有规范性。

Come from: http://www.zdwx.com/Knowledge/Art-4194-9.html

jQuery 1.3 正式版发布公告

http://docs.jquery.com/Release:jQuery_1.3

jQuery 1.3终于发布了。
min版(gzip后18kb)
源码(114kb)

另外可以用google的代码托管:
http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js

下面这个是我自己用Packer压缩的pack版
http://shawphy.com/down/jquery-1.3.pack.js(37kb)

简要来说:

更新了Sizzle选择器引擎,这个之前也提到过。可以查看他的性能:

此外据声称,把代码给了dojo基金会。这回Sizzle的野心在于能够让其他各种JS库都能用,包括Prototype, Dojo, Yahoo UI, MochiKit, 和 TinyMCE等等其他库。

live 事件
这也是jQuery 1.3这次更新的第二个重大更新。

可以看下面iframe中的效果以及源码

性能比较:

这样,我以前写的关于重复绑定的文章就差不多可以抛弃了

Event 对象
新增了一个jQuery.Event对象,他根据w3c文档,做了一个完整的,兼容所有浏览器的一个对象。具体还得看文档。

append, prepend, before, 和 after 方法重写
据声称,这些方法的效率提升了6倍

重写了offset方法
这回更快了

取消了浏览器侦测,全面改用jQuery.support
具体还得看文档了。
变化:
其中与开发者比较密切的是
[@attr] 中的@在1.3里不能用了
用trigger触发的事件现在能冒泡了
ready方法中,再也不等css加载完了再执行其中代码了。直接要求把css放在脚本之前就行
简化了.isFunction方法,那些偏门的就被无视了
用选择器a, b, c选择东西,在支持querySelectorAll (Safari, Firefox 3.1+, Opera 10+, IE 8+)中会按照这些元素在文档中顺序来确定这些数组在获得的对象列表中的位置。而不支持这个方法的浏览器则按照选择器顺序排好
新增了jQuery.Event
要求网页都在标准模式下,不要在怪异模式下使用,否则会报错。
以下3个方法属性已被不推荐使用。
* jQuery.browser
* jQuery.browser.version
* jQuery.boxModel

具体内容:
内核部分:
更好的queue, dequeue
新增selector, context这两个属性,分别指向获取这个元素的原始选择器和被查找的内容(可选)
选择器部分:
Sizzle的使用
复杂的css例如not(a, b)
属性部分:
toggleClass( “className”, state ) - 增加了一个布朗值的参数。
筛选文档:
.closest( selector ) - 找到离这个元素最近的一个父元素。这跟parents不一样。
is() 也支持更复杂的选择器了。
操作文档:
HTML Injection重写了
$(”<script/>”) 就自动转化为 $(document.createElement(”script”))
css:
offset()重写了
事件:
Live 事件
jQuery.Event
trigger()会冒泡了
效果:
hide() .show()之类的加快速度
内置动画效果考虑到了margin和 padding
.toggle( boolean ) 多提供了一个参数
jQuery.fx.off 关闭所有动画
AJAX:
.load()支持了文本格式的数据
工具:
新增jQuery.isArray

内部:
jQuery.support

另外这回改用YUI的工具压脚本了

========================================

最后预告一下,jQuery文档官网已经针对1.3版做了修改,中文文档也在紧张制作中。
文档地址:http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html

Come from: http://shawphy.com/2009/01/release-jquery-1-3.html

JavaScript Event Delegation is Easier than You Think

If you’re into adding a little JavaScript interactivity to your web pages you may have heard of JavaScript event delegation and thought it was one of those convoluted design patterns only hardcore JavaScript programmers worry about. The truth is, if you already know how to add JavaScript event handlers, it’s a snap to implement.

JavaScript events are the bedrock of all interactivity on web pages (I mean serious interactivity, not those dinky CSS drop-down menus). In traditional event handling you add or remove event handlers from each element as needed. However, event handlers can potentially cause of memory leaks and performance degradation — the more you have, the greater the risk. JavaScript event delegation is a simple technique by which you add a single event handler to a parent element in order to avoid having to add event handlers to multiple child elements.

How does it work?

Event delegation makes use of two often overlooked features of JavaScript events: event bubbling and the target element. When an event is triggered on an element, for example a mouse click on a button, the same event is also triggered on all of that element’s ancestors. This process is known as event bubbling; the event bubbles up from the originating element to the top of the DOM tree. The target element of any event is the originating element, the button in our example, and is stored in a property of the event object. Using event delegation it’s possible to add an event handler to an element, wait for an event to bubble up from a child element and easily determine from which element the event originated.

How will it help me?

Imagine an HTML table with 10 columns and 100 rows in which you want something to happen when the user clicks on a table cell. For example, I once had to make each cell of a table of that size editable when clicked. Adding event handlers to each of the 1000 cells would be a major performance problem and, potentially, a source of browser-crashing memory leaks. Instead, using event delegation, you would add only one event handler to the table element, intercept the click event and determine which cell was clicked.

What does it look like in code?

The code is simple; we only need to worry about detecting the target element. Let’s say we have a table element with the ID “report” and we have added an event handler to the table for the click event that will call the editCell function. The editCell function will need to determine the target element for the event that has bubbled up to the table. Expecting that we’ll write a few event handler functions that will need this functionality, we’ll place it in a separate function called getEventTarget:

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

The variable e represents the event object and we need only a sprinkling of cross-browser code to gain access to and return the target element, stored in the srcElement property in Internet Explorer and the target property in other browsers.

Next is the editCell function that calls the getEventTarget function. Once we have a reference to the target element it’s up to us to make sure the element is the one we’re expecting:

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

In the editCell function we confirm that the target element is a table cell by checking its tag name. That check may be over simplified; what if it’s another element inside the table cell that is the target of the event? A quick modification that adds code to find the parent td element may be needed. What if some cells should not be editable? In that case we can add a specific class name to a non-editable cell and check that the target element does not have that class name value before making it editable. Many options are available and you’ll just need to choose the one that suits your application.

What are the pros and cons?

The benefits of JavaScript event delegation are:

  • There are less event handlers to setup and reside in memory. This is the big one; better performance and less crashing.
  • There’s no need to re-attach handlers after a DOM update. If your page content is generated dynamically, via Ajax for example, you don’t need to add and remove event handlers as elements are loaded or unloaded.

The potential problems may be less clear, but once you are aware of them they’re easily avoided:

  • There’s a risk your event management code could become a performance bottleneck, so keep it as lean as possible.
  • Not all events bubble. The blur, focus, load and unload events don’t bubble like other events. The blur and focus events can actually be accessed using the capturing phase (in browsers other than IE) instead of the bubbling phase but that’s a story for another day.
  • You need caution when managing some mouse events. If your code is handling the mousemove event you are in serious risk of creating a performance bottleneck because the mousemove event is triggered so often. The mouseout event has a quirky behaviour that is difficult to manage with event delegation.

Summary

There are JavaScript event delegation examples available that use major libraries: jQuery, Prototype, and Yahoo! UI. You can also find examples using no library at all, like this one from the Usable Type blog.

Event delegation is a handy tool to have in your kit should the need arise and easy to implement.

Come from: http://www.sitepoint.com/blogs/2008/07/23/javascript-event-delegation-is-easier-than-you-think/

限定字符长度,截断中文字符

今日遇到个麻烦事。input限定输入字节数是8,中文自然算两个字节。本来一路顺利,keyup keydown keypress事件挨个试过去,把中文用正则替换成两个英文字符,超过8的就return false。ie下表现超级完美。
这个时侯Firefox下麻烦事就开始了,ie下,中文输入法状态下他也是能捕获键盘事件的。但ff下却无法捕获输入法状态下的键盘事件,比如我搜狗,他只能识别到最后那次空格……一恼火,干脆换条思路,直接截断字符来解决。效果感觉还行,总比没有好,此方法也适用于复制进去的文本。

  1. $("input").bind("keyup",function() {
  2.     var str=this.value;
  3.     while (str.replace(/[^\x00-\xFF]/g,"aa").length>8) {
  4.         str=str.substr(0,str.length-1);
  5.     }
  6.     this.value=str;
  7. });

代码很简单,也很安全。想封装成其他形式请自便。

我这里用的是减法,对于input这种很合适。因为不会多出去很多字符的。
这里我事后搜到一个做加法的,也不错,可以参考一下。只是不建议像他这样直接给原生对象做扩展,容易冲突。放到自己的私有对象下会比较好。

Come from: http://shawphy.com/2009/02/cut-chinese-character.html

javascript 中英文字符长度和截断处理

因:javascript中的String类自带的length属性 和 substr()方法虽然能判断和截取出字符个数,但是对字节个数却没有处理的方法(众所周知,中文字符占两个字节,英文只占一个)

果:中英文字符在页面上的占位空间存在差异。中文的web开发人员不能一刀切,对中英文都截取同样长度的字符数。

网上大致有两种方法处理中英文字符。一种是把中文字符escape了,然后计算字节长度。一种是用正则表达式把中文字符转换2个字节的符号,然后计算长度

 

推荐第二种方法,简单明了,速度快,效率高。

按照第二种方法,对javascript 的 String类型做以下扩展:

一.String.len() 方法,计算字符串字节个数:

1 String.prototype.len=function()         
2 {                 
3  return this.replace(/[^\x00-\xff]/g,"rr").length;          
4 }

 

二.String.sub(endindex) 方法,从0开始截取endindex长度的字节数。

 1 
 2 String.prototype.sub = function(n)
 3 {    
 4  var r = /[^\x00-\xff]/g;    
 5  if(this.replace(r, "mm").length <= n) return this;   
 6  // n = n - 3;    
 7  var m = Math.floor(n/2);    
 8  for(var i=m; i<this.length; i++) {    
 9  if(this.substr(0, i).replace(r, "mm").length>=n) {    
10   return this.substr(0, i) ; }    
11  } return this;   
12 };  

 

 

使用方法:最好写成公用脚本,放到所有脚本前面,调用如下:

 

1 var a='tom正在测试中英文字符处理';
2 alert(a.len());
3 alert(a.sub(5));

Come from: http://www.cnblogs.com/PatrickChen/archive/2008/10/17/1313250.html

网站运营的七大瓶颈思考

许多站长在网站发展的每个阶段,都会遇到不同的难点,本文从以下七个方面分析如何突破网站的阶段性瓶颈问题。


一、网站定位瓶颈

网站建设之初,往往出现的就是定位问题。网站定位的模糊性,会迫使站点一次又一次的改版,最终迷失方向。但这个阶段,大多数站长怀着对新领域的喜爱,都会坚持下去。特别是随着对目标用户的研究及网站盈利点的挖掘,才会慢慢解开网站发展方向性的症结。难度系数:10%

二、网站推广瓶颈

网站上线后,大多数站长都急于将站点推广出去,让网站获得足够的曝光,特别是能吸引到一定目标用户的注意。没有经验的都会出现迷茫,短时间找不到高效的推广方式。时间的流逝,也会丧失对机会的把握上。当然,每个行业在推广方式上不尽相同,有的适合搜索引擎营销,有的适合网站联盟营销,也有的可以用网站推广2.0及SMO,另外还有一些独特的模式。如:PPG当初的成功就是靠大量的平面广告的投入。难度系数:30%

三、网站流量瓶颈

大多数站长管理员都热衷于网站流量的变化,但网站发展一定的阶段,流量却不能取得本质的突破,他们就困惑了,如何提高站点的流量呢?我觉得先要反问下自己,该做的自己都做了吗,做了的都做好了吗?要勤于观察竞争对手的动向及对整个领域的规模把握。Charles(http://www.kseo.cn)认为单纯为提高网站流量(或者Alexa排名、PR值)是不健康的,应该深入研究长尾理论,而不是垃圾流量。难度系数:40%

四、网站价值瓶颈

如果一个网站的发展,先想办法让其曝光,那么下一步就是网站知名度的问题了。这就体现在网站的核心价值是什么,内容、服务还是功能?如何体现网站的独特优势,是站长普遍都遇到的。所以挖掘细分市场或垂直领域的潜力是体现网站价值的重要选择。难度系数:50%

五、技术瓶颈

不仅仅是网站程序、功能更新,还涉及到服务器升级、安全维护等技术瓶颈。没有强悍的后援技术支持,一个站点抗干扰能力就非常弱。除了要不断对用户体验进行修正,还要防止别人复制模仿,乃至恶意攻击。加强技术团队的建设,若能树立技术壁垒,网站的成功概率就会大大提高。难度系数:60%

六、盈利模式瓶颈

很多站长能快速积累一定的用户基数,却找不到合适的盈利模式。网站要发展,如果一直没有盈利,生存空间就会很狭窄。除了要控制人力成本,探索网站可行的有价值的盈利模式将是每个站长或CEO必须面对的。没有统一的解决方法,但可以借鉴一些成功的网站盈利模式。难度系数:80%

七、可持续发展瓶颈

即便是已经成熟的网站,盲区还是在可持续发展上。这不仅要求网站本身的不断创新,领导层还必须要对市场前瞻性的判断力及执行力。难度系数:100%

另外,Charles推荐两篇文章《站点运营中的三六九法则》及《网站运营应把握好的三度:曝光度,知名度,忠诚度》,对网站运营阶段的瓶颈都说的非常中肯。本人博客地址为: http://www.kseo.cn 欢迎订阅。