<PUBLIC:COMPONENT tagName="test1"> <ATTACH EVENT="oncontentready" ONEVENT="fnInit()"/> <PUBLIC:PROPERTY GET = "getOutHtml" NAME = "outHtml" PUT = "setOutHtml"/><SCRIPT LANGUAGE="JavaScript"> function fnInit() {
} function getOutHtml() { return element.outerHTML } function setOutHtml( v ) { element.outerHTML = v ; } </SCRIPT> </PUBLIC:COMPONENT> 老大,你说的那个我知道的.我也知道它能使每一个节点都拥有这个属性.(也算是FF的一个小优点吧) 但我恰恰想说的,用户在大多数时候并不需要扩展每个节点的属性和方法,而是需要像HTC这样的组件化的概念. 像上面这样方便而对像化的组件功能,FF有吗?另外,梅老大你的技术我是很佩服的,但偶觉得没必要在一些细节上纠缠太多. 总体上来看,从功能的角度说,FF和IE4是一个档次,和IE5无法比较,这个结论想来是没问题的. (也许吧,FF也有一些自己特有而IE没有的良好功能,毕竟它借鉴了微软的许多经验.但这是不足以影响整体评价的,呵呵.)
The W3C was founded in October 1994 to lead the World Wide Web to its full potential by developing
Document Object Model (DOM) Level 1 Specification (Second Edition) Version 1.0 W3C Working Draft 29 September, 2000W3C的DOM标准板的的确确是晚于IE的,呵呵.
像上面这样方便而对像化的组件功能,FF有吗?-----------------------@xishanlang2001(西山狼2000) Mozilla有XBL来定义behavior的<binding> <constructor> <![CDATA[ script to do ]]> </constructor> <binding>
if (Browser.isMozilla) { // set up ie environment for Moz extendEventObject(); emulateAttachEvent(); emulateEventHandlers(["click", "dblclick", "mouseover", "mouseout", "mousedown", "mouseup", "mousemove", "keydown", "keypress", "keyup"]); emulateCurrentStyle(); /*emulateDocumentAll(); emulateElement() */ // It is better to use a constant for event.button Event.LEFT = 0; Event.MIDDLE = 1; Event.RIGHT = 2; } else { Event = {}; // IE is returning wrong button number Event.LEFT = 1; Event.MIDDLE = 4; Event.RIGHT = 2; } /* * Extends the event object with srcElement, cancelBubble, returnValue, * fromElement and toElement */ function extendEventObject() { Event.prototype.__defineSetter__("returnValue", function (b) { if (!b) this.preventDefault(); return b; }); Event.prototype.__defineSetter__("cancelBubble", function (b) { if (b) this.stopPropagation(); return b; }); Event.prototype.__defineGetter__("srcElement", function () { var node = this.target; while (node.nodeType != 1) node = node.parentNode; return node; }); Event.prototype.__defineGetter__("fromElement", function () { var node; if (this.type == "mouseover") node = this.relatedTarget; else if (this.type == "mouseout") node = this.target; if (!node) return; while (node.nodeType != 1) node = node.parentNode; return node; }); Event.prototype.__defineGetter__("toElement", function () { var node; if (this.type == "mouseout") node = this.relatedTarget; else if (this.type == "mouseover") node = this.target; if (!node) return; while (node.nodeType != 1) node = node.parentNode; return node; }); Event.prototype.__defineGetter__("offsetX", function () { return this.layerX; }); Event.prototype.__defineGetter__("offsetY", function () { return this.layerY; }); } /* * Emulates element.attachEvent as well as detachEvent */ function emulateAttachEvent() { HTMLDocument.prototype.attachEvent = HTMLElement.prototype.attachEvent = function (sType, fHandler) { var shortTypeName = sType.replace(/on/, ""); fHandler._ieEmuEventHandler = function (e) { window.event = e; return fHandler(); }; this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); }; HTMLDocument.prototype.detachEvent = HTMLElement.prototype.detachEvent = function (sType, fHandler) { var shortTypeName = sType.replace(/on/, ""); if (typeof fHandler._ieEmuEventHandler == "function") this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); else this.removeEventListener(shortTypeName, fHandler, true); }; } /* * This function binds the event object passed along in an * event to window.event */ function emulateEventHandlers(eventNames) { for (var i = 0; i < eventNames.length; i++) { document.addEventListener(eventNames[i], function (e) { window.event = e; }, true); // using capture } } /* * Simple emulation of document.all * this one is far from complete. Be cautious */ function emulateAllModel() { var allGetter = function () { var a = this.getElementsByTagName("*"); var node = this; a.tags = function (sTagName) { return node.getElementsByTagName(sTagName); }; return a; }; HTMLDocument.prototype.__defineGetter__("all", allGetter); HTMLElement.prototype.__defineGetter__("all", allGetter); } function extendElementModel() { HTMLElement.prototype.__defineGetter__("parentElement", function () { if (this.parentNode == this.ownerDocument) return null; return this.parentNode; }); HTMLElement.prototype.__defineGetter__("children", function () { var tmp = []; var j = 0; var n; for (var i = 0; i < this.childNodes.length; i++) { n = this.childNodes[i]; if (n.nodeType == 1) { tmp[j++] = n; if (n.name) { // named children if (!tmp[n.name]) tmp[n.name] = []; tmp[n.name][tmp[n.name].length] = n; } if (n.id) // child with id tmp[n.id] = n } } return tmp; }); HTMLElement.prototype.contains = function (oEl) { if (oEl == this) return true; if (oEl == null) return false; return this.contains(oEl.parentNode); }; } function emulateCurrentStyle() { HTMLElement.prototype.__defineGetter__("currentStyle", function () { return this.ownerDocument.defaultView.getComputedStyle(this, null); /* var cs = {}; var el = this; for (var i = 0; i < properties.length; i++) { cs.__defineGetter__(properties[i], encapsulateObjects(el, properties[i])); } return cs; */ }); } function emulateHTMLModel() { // This function is used to generate a html string for the text properties/methods // It replaces '\n' with "<BR"> as well as fixes consecutive white spaces // It also repalaces some special characters function convertTextToHTML(s) { s = s.replace(/\&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\n/g, "<BR>"); while (/\s\s/.test(s)) s = s.replace(/\s\s/, " "); return s.replace(/\s/g, " "); } HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) { var df; // : DocumentFragment var r = this.ownerDocument.createRange(); switch (String(sWhere).toLowerCase()) { case "beforebegin": r.setStartBefore(this); df = r.createContextualFragment(sHTML); this.parentNode.insertBefore(df, this); break; case "afterbegin": r.selectNodeContents(this); r.collapse(true); df = r.createContextualFragment(sHTML); this.insertBefore(df, this.firstChild); break; case "beforeend": r.selectNodeContents(this); r.collapse(false); df = r.createContextualFragment(sHTML); this.appendChild(df); break; case "afterend": r.setStartAfter(this); df = r.createContextualFragment(sHTML); this.parentNode.insertBefore(df, this.nextSibling); break; } }; HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) { var r = this.ownerDocument.createRange(); r.setStartBefore(this); var df = r.createContextualFragment(sHTML); this.parentNode.replaceChild(df, this); return sHTML; }); HTMLElement.prototype.__defineGetter__("canHaveChildren", function () { switch (this.tagName) { case "AREA": case "BASE": case "BASEFONT": case "COL": case "FRAME": case "HR": case "IMG": case "BR": case "INPUT": case "ISINDEX": case "LINK": case "META": case "PARAM": return false; } return true; }); HTMLElement.prototype.__defineGetter__("outerHTML", function () { var attr, attrs = this.attributes; var str = "<" + this.tagName; for (var i = 0; i < attrs.length; i++) { attr = attrs[i]; if (attr.specified) str += " " + attr.name + '="' + attr.value + '"'; } if (!this.canHaveChildren) return str + ">"; return str + ">" + this.innerHTML + "</" + this.tagName + ">"; }); HTMLElement.prototype.__defineSetter__("innerText", function (sText) { this.innerHTML = convertTextToHTML(sText); return sText; }); var tmpGet; HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function () { var r = this.ownerDocument.createRange(); r.selectNodeContents(this); return r.toString(); }); HTMLElement.prototype.__defineSetter__("outerText", function (sText) { this.outerHTML = convertTextToHTML(sText); return sText; }); HTMLElement.prototype.__defineGetter__("outerText", tmpGet); HTMLElement.prototype.insertAdjacentText = function (sWhere, sText) { this.insertAdjacentHTML(sWhere, convertTextToHTML(sText)); }; }
google analytics的流量分析,光是我个人的小blog每日firefox的使用人数已经增加到了29%。不能说因为要多开发一套兼容脚本舍弃ff,再说了,w3c七七八八我不是很懂,不过w3c提倡的是高效简单干净的阅读方式。如果要为了花梢增加js方面的枝枝叶叶,w3c可不服务到这个程度,我关注并使用ff主要也是因为对于css模式,更加适合作为一个设计者。firefox各方面是没有ie好。没有高自由的兼容性,正是为了引导设计者们走上正途,为协同团队缔造下一代人。
<!--
if(typeof(HTMLElement)!="undefined" && !window.opera)
{
HTMLElement.prototype.__defineGetter__("outerHTML",function()
{
var a=this.attributes, str="<"+this.tagName, i=0;for(;i<a.length;i++)
if(a[i].specified) str+=" "+a[i].name+'="'+a[i].value+'"';
if(!this.canHaveChildren) return str+" />";
return str+">"+this.innerHTML+"</"+this.tagName+">";
});
HTMLElement.prototype.__defineGetter__("canHaveChildren",function()
{
return !/^(area|base|basefont|col|frame|hr|img|br|input|isindex|link|meta|param)$/.test(this.tagName.toLowerCase());
});
}alert(document.getElementById("div1").outerHTML);
//-->
</SCRIPT>比如这样在 FF 里可以自己扩充 .outerHTML 属性,但在 IE 里却无法这样扩充对象的属性的
<ATTACH EVENT="oncontentready" ONEVENT="fnInit()"/>
<PUBLIC:PROPERTY GET = "getOutHtml" NAME = "outHtml" PUT = "setOutHtml"/><SCRIPT LANGUAGE="JavaScript">
function fnInit()
{
}
function getOutHtml()
{
return element.outerHTML
}
function setOutHtml( v )
{
element.outerHTML = v ;
}
</SCRIPT>
</PUBLIC:COMPONENT> 老大,你说的那个我知道的.我也知道它能使每一个节点都拥有这个属性.(也算是FF的一个小优点吧)
但我恰恰想说的,用户在大多数时候并不需要扩展每个节点的属性和方法,而是需要像HTC这样的组件化的概念.
像上面这样方便而对像化的组件功能,FF有吗?另外,梅老大你的技术我是很佩服的,但偶觉得没必要在一些细节上纠缠太多.
总体上来看,从功能的角度说,FF和IE4是一个档次,和IE5无法比较,这个结论想来是没问题的.
(也许吧,FF也有一些自己特有而IE没有的良好功能,毕竟它借鉴了微软的许多经验.但这是不足以影响整体评价的,呵呵.)
---------------
赞成你的观点:"做产品有很多实际情况,标准只是一个方向,谁也不可能说完全照着标准写".我是想说,FF太不诚实了,明明是功能差,非要找借口,归咎于他们要"按W3C"标准.
呵呵.
最近项目中用了大量的HTC技术,感觉很方便,封闭性也好.但在作之前就有人提出FF和W3C的问题,好在后来发现FF的用户非常少.但如果真在照顾FF,恐怕就要另开发一套代码了.呵呵.
也许有人会说,HTC的问题还能委屈自己(会增加多少工作量并降低多大的效率呢?),那VML的项目怎么办?而且,偶最大的担心是,“稍微照顾”一下其它的浏览器的策略,恐怕也只是权宜之计罢了.
FF也要进步的,这么发展下去,早晚会回到到微软大战网景的时代,同样的功能,开发两套代码.假如W3C足够合理,还会出现这种情况吗?
FF还会有这种借口吗?魔王说话的措辞方式我颇不赞成,但他的态度我觉得很可取:
与其消极地去兼容FF和W3C,不如去抵制他们,让他们去适应合理的东西.呵呵.
为什么W3C一定要作成这样呢?
为什么FF一定要给程序员的工作增加无谓的负担呢?
Version 1.0
W3C Working Draft 29 September, 2000W3C的DOM标准板的的确确是晚于IE的,呵呵.
<constructor>
<![CDATA[
script to do
]]>
</constructor>
<binding>
不知哪个更好用一点,呵呵.不过,这东东并不是W3C标准的呀.........
这下偶可更坚定自己的信心了:如果FF真发展起来的话,咱们WEB程序员可真要回到网景时代了:同一个功能,写两套代码了.
不知楼上是否同意?偶也更坚定自己的观点了:FF哪里是遵循W3C标准,W3C以后的好功能,它不是也开发了很多的嘛.
所谓遵循W3C标准,只是它为了掩饰自己功能不足的一个幌子和噱头罢了.
我前台页面只用了两个js,当然代码有一千多行,但改了好几天了,还没有搞定。
不过FF也做得比较牛了,大部分代码都支持了,一开始改起来还是很爽的,但某些功能硬是不支持,可就惨了,现在碰到的是outerHTML和event。还好event是扩展用的,但outerHTML一定要用到,所以还在找高手问。但我写的程序,后台管理方面肯定不可能考虑FF了,因为有些是根本就是不可能做到的,还有不少会浪费我的好多时间。另外使用outerHTML时,FF它并没有提示出错,我以为它是支持的,害得我找了好长时间的原因,看来FF真够不诚实的。
并非用两套代码,事实上,以htc定义的代码,你仔细的看看,是否是XML的格式呢?(看看你上面写的htc,把头部加上<?xml version="1.0" encoding="utf-8"?>,再把script中加入CDATA,以这样来看的话,两者可以有共通的代码,也就是我们不一定要用两套(一种htc,一种xbl来实现),事实上这两套的实质代码都是一样的,只是定义不同而已,由此可见,定义起来并不麻烦。而事实上,也是可以实现。P.S
如果要兼容的话,一般情况下也不建议使用xbl或者htc,
毕竟兼容性这东西,在国内来说,如果客户不需要,我们可以不必去搞兼容的事,但在国外,80%以上的程序都是兼容Mozilla的。
我做程序,想兼容的时候就多想点,只要IE的时候就不管太多。
想来也只是一种政治策略,想用这种方式抵制微软罢了.
因为,它的标准是后于浏览器而出的,又不想被微软牵着鼻子走.于是呢,神仙打仗,我等百姓遭灾.就目前的情况来说,已经给许多程序员增加了许多无谓的工作量了.
正如BlueDestiny(www.never-online.net) 所说,代码是有许多相同的地方,可以复制粘贴过去的.但那仍是两套代码啊;甚至或者放弃HTC这样好用的功能,可这将使开发效率、执行效率可多少折扣呢?最让人担心的还在后面,打个夸张的比方:如果哪天FF觉得outerHTML这个属性好用,自己出一个功能相同的东西叫outerHTML2,那你的代码怎么办?
可现在的HTC和XBL不就是这样的逻辑吗?
而且,出于政治因素,W3C说不定还会把outerHTML2放到标准里去,那你的代码又怎么办呢?
extendEventObject();
emulateAttachEvent();
emulateEventHandlers(["click", "dblclick", "mouseover", "mouseout",
"mousedown", "mouseup", "mousemove",
"keydown", "keypress", "keyup"]);
emulateCurrentStyle();
/*emulateDocumentAll();
emulateElement()
*/
// It is better to use a constant for event.button
Event.LEFT = 0;
Event.MIDDLE = 1;
Event.RIGHT = 2;
}
else {
Event = {};
// IE is returning wrong button number
Event.LEFT = 1;
Event.MIDDLE = 4;
Event.RIGHT = 2;
}
/*
* Extends the event object with srcElement, cancelBubble, returnValue,
* fromElement and toElement
*/
function extendEventObject() {
Event.prototype.__defineSetter__("returnValue", function (b) {
if (!b) this.preventDefault();
return b;
});
Event.prototype.__defineSetter__("cancelBubble", function (b) {
if (b) this.stopPropagation();
return b;
});
Event.prototype.__defineGetter__("srcElement", function () {
var node = this.target;
while (node.nodeType != 1) node = node.parentNode;
return node;
});
Event.prototype.__defineGetter__("fromElement", function () {
var node;
if (this.type == "mouseover")
node = this.relatedTarget;
else if (this.type == "mouseout")
node = this.target;
if (!node) return;
while (node.nodeType != 1) node = node.parentNode;
return node;
});
Event.prototype.__defineGetter__("toElement", function () {
var node;
if (this.type == "mouseout")
node = this.relatedTarget;
else if (this.type == "mouseover")
node = this.target;
if (!node) return;
while (node.nodeType != 1) node = node.parentNode;
return node;
});
Event.prototype.__defineGetter__("offsetX", function () {
return this.layerX;
});
Event.prototype.__defineGetter__("offsetY", function () {
return this.layerY;
});
}
/*
* Emulates element.attachEvent as well as detachEvent
*/
function emulateAttachEvent() {
HTMLDocument.prototype.attachEvent =
HTMLElement.prototype.attachEvent = function (sType, fHandler) {
var shortTypeName = sType.replace(/on/, "");
fHandler._ieEmuEventHandler = function (e) {
window.event = e;
return fHandler();
};
this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
};
HTMLDocument.prototype.detachEvent =
HTMLElement.prototype.detachEvent = function (sType, fHandler) {
var shortTypeName = sType.replace(/on/, "");
if (typeof fHandler._ieEmuEventHandler == "function")
this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
else
this.removeEventListener(shortTypeName, fHandler, true);
};
}
/*
* This function binds the event object passed along in an
* event to window.event
*/
function emulateEventHandlers(eventNames) {
for (var i = 0; i < eventNames.length; i++) {
document.addEventListener(eventNames[i], function (e) {
window.event = e;
}, true); // using capture
}
}
/*
* Simple emulation of document.all
* this one is far from complete. Be cautious
*/
function emulateAllModel() {
var allGetter = function () {
var a = this.getElementsByTagName("*");
var node = this;
a.tags = function (sTagName) {
return node.getElementsByTagName(sTagName);
};
return a;
};
HTMLDocument.prototype.__defineGetter__("all", allGetter);
HTMLElement.prototype.__defineGetter__("all", allGetter);
}
function extendElementModel() {
HTMLElement.prototype.__defineGetter__("parentElement", function () {
if (this.parentNode == this.ownerDocument) return null;
return this.parentNode;
});
HTMLElement.prototype.__defineGetter__("children", function () {
var tmp = [];
var j = 0;
var n;
for (var i = 0; i < this.childNodes.length; i++) {
n = this.childNodes[i];
if (n.nodeType == 1) {
tmp[j++] = n;
if (n.name) { // named children
if (!tmp[n.name])
tmp[n.name] = [];
tmp[n.name][tmp[n.name].length] = n;
}
if (n.id) // child with id
tmp[n.id] = n
}
}
return tmp;
});
HTMLElement.prototype.contains = function (oEl) {
if (oEl == this) return true;
if (oEl == null) return false;
return this.contains(oEl.parentNode);
};
}
function emulateCurrentStyle() {
HTMLElement.prototype.__defineGetter__("currentStyle", function () {
return this.ownerDocument.defaultView.getComputedStyle(this, null);
/*
var cs = {};
var el = this;
for (var i = 0; i < properties.length; i++) {
cs.__defineGetter__(properties[i], encapsulateObjects(el, properties[i]));
}
return cs;
*/
});
}
function emulateHTMLModel() {
// This function is used to generate a html string for the text properties/methods
// It replaces '\n' with "<BR"> as well as fixes consecutive white spaces
// It also repalaces some special characters
function convertTextToHTML(s) {
s = s.replace(/\&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\n/g, "<BR>");
while (/\s\s/.test(s))
s = s.replace(/\s\s/, " ");
return s.replace(/\s/g, " ");
}
HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
var df; // : DocumentFragment
var r = this.ownerDocument.createRange();
switch (String(sWhere).toLowerCase()) {
case "beforebegin":
r.setStartBefore(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this);
break;
case "afterbegin":
r.selectNodeContents(this);
r.collapse(true);
df = r.createContextualFragment(sHTML);
this.insertBefore(df, this.firstChild);
break;
case "beforeend":
r.selectNodeContents(this);
r.collapse(false);
df = r.createContextualFragment(sHTML);
this.appendChild(df);
break;
case "afterend":
r.setStartAfter(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this.nextSibling);
break;
}
};
HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var df = r.createContextualFragment(sHTML);
this.parentNode.replaceChild(df, this);
return sHTML;
});
HTMLElement.prototype.__defineGetter__("canHaveChildren", function () {
switch (this.tagName) {
case "AREA":
case "BASE":
case "BASEFONT":
case "COL":
case "FRAME":
case "HR":
case "IMG":
case "BR":
case "INPUT":
case "ISINDEX":
case "LINK":
case "META":
case "PARAM":
return false;
}
return true;
});
HTMLElement.prototype.__defineGetter__("outerHTML", function () {
var attr, attrs = this.attributes;
var str = "<" + this.tagName;
for (var i = 0; i < attrs.length; i++) {
attr = attrs[i];
if (attr.specified)
str += " " + attr.name + '="' + attr.value + '"';
}
if (!this.canHaveChildren)
return str + ">";
return str + ">" + this.innerHTML + "</" + this.tagName + ">";
});
HTMLElement.prototype.__defineSetter__("innerText", function (sText) {
this.innerHTML = convertTextToHTML(sText);
return sText;
});
var tmpGet;
HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function () {
var r = this.ownerDocument.createRange();
r.selectNodeContents(this);
return r.toString();
});
HTMLElement.prototype.__defineSetter__("outerText", function (sText) {
this.outerHTML = convertTextToHTML(sText);
return sText;
});
HTMLElement.prototype.__defineGetter__("outerText", tmpGet);
HTMLElement.prototype.insertAdjacentText = function (sWhere, sText) {
this.insertAdjacentHTML(sWhere, convertTextToHTML(sText));
};
}
<STYLE>
</STYLE><SCRIPT language=JavaScript1.5>
HTMLElement.prototype.outerHTML getter = function () {
return getOuterHTML (this);
}
function getOuterHTML (node) {
var emptyElements = {
HR: true, BR: true, IMG: true, INPUT: true
};
var specialElements = {
TEXTAREA: true
};
var html = '';
switch (node.nodeType) {
case Node.ELEMENT_NODE:
html += '<';
html += node.nodeName;
if (!specialElements[node.nodeName]) {
for (var a = 0; a < node.attributes.length; a++)
html += ' ' + node.attributes[a].nodeName.toUpperCase() +
'="' + node.attributes[a].nodeValue + '"';
html += '>';
if (!emptyElements[node.nodeName]) {
html += node.innerHTML;
html += '<\/' + node.nodeName + '>';
}
}
else switch (node.nodeName) {
case 'TEXTAREA':
for (var a = 0; a < node.attributes.length; a++)
if (node.attributes[a].nodeName.toLowerCase() != 'value')
html += ' ' + node.attributes[a].nodeName.toUpperCase() +
'="' + node.attributes[a].nodeValue + '"';
else
var content = node.attributes[a].nodeValue;
html += '>';
html += content;
html += '<\/' + node.nodeName + '>';
break;
}
break;
case Node.TEXT_NODE:
html += node.nodeValue;
break;
case Node.COMMENT_NODE:
html += '<!' + '--' + node.nodeValue + '--' + '>';
break;
}
return html;
}
</SCRIPT><META content="MSHTML 6.00.2800.1555" name=GENERATOR></HEAD>
<BODY><A href="javascript: alert(document.documentElement.outerHTML); void 0">show document.documentElement.outerHTML </A>| <A href="javascript: alert(document.body.outerHTML); void 0">show document.body.outerHTML </A>| <A href="javascript: alert(document.documentElement.innerHTML); void 0">show document.documentElement.innerHTML </A>| <A href="javascript: alert(document.body.innerHTML); void 0">show document.body.innerHTML </A>
<FORM name=formName><TEXTAREA name=aTextArea rows=5>JavaScript.FAQTs.com
Kibology for all.
</TEXTAREA> </FORM>
<DIV>
<P>JavaScript.FAQTs.com </P>
<BLOCKQUOTE>Kibology for all. <BR>All for Kibology. </BLOCKQUOTE></DIV></BODY></HTML>
createPopup() 也有,是xul
呵呵。ttyp和梅老大:
你们写的FF下的outerHTML确实好用,不过说到标准,innerHTML仍然不是W3C标准里的。(只是FF仍然支持的)
那是不是可以这么理解:
可以稍微花一些精力兼容一下FF,但W3C是完全没必要去理会的?
技术,现在居然要作兼容firefox的程序。
其实IE也是基于Mozilla的,从它的头信息中也有这个可以看出
魔王立江好聪明啊,一开始拼命诋毁firefox,以引起大家对他的反击,自己乘机学到fireofox的
技术,现在居然要作兼容firefox的程序。
回复:我主要是发现我的网站前台程序只有一个js文件实现了所要的所有功能,所以想改进一下这个js文件,让它支持ff,但发现这个工作量是很大的,改一个文件就花了不少时间,不过FF是写得不错,但现在它的这种态度,恐怕失败是肯定的。我做网站到现在,全部只支持IE的,有些还是国外的网站,但还没有碰到客户说我的网站只支持IE,说明FF除了开发人员,根本就没有人用,包括国外也是。
很多人一方面认为外国人是不懂得思考好与差的,另一方面又认为外国比中国先进几十年。难道外国P4电脑几十年就有了,几十年前就有jscript?
什么叫"为了花梢"?网页如果离了脚本,就像作菜没有油盐、画画没有画板一样。
楼上的仁兄说"w3c七七八八',那咱们举个简单的例子:动网7发帖子,使用的是脚本制作的在线编辑器,这个大家都知道吧?在FF下就不能用.
为什么呢?因为W3C就不支持主页通过脚本去控制iframe.那么大家发帖子的时候,是喜欢用在线编辑器,还是喜欢用呆板的文本框呢?在线编辑器是"为了花梢"吗?那是实实在在的功能啊!----再进一步说,现在Ajax的声音是越来越高了,"Ajax"中的字母J就是javascript的意思,离开了脚本,你怎么实现Ajax?
脚本仅仅是"为了花梢"?
在W3C的标准下,许多实实在在的功能都没办法实现.WEB客户端的技术可不只是设计一下网页这么简单,如果W3C只能"服务到这个程度"的话,大家还是考虑一下要不要认可它吧?我还是那句话:
VML哪里不好?
HTC哪里不好?
父子页面的相互控制哪里不好?
W3C真是从技术角度舍弃它们,还是出于政治目的抵制他们呢?W3C出于政治目的造成的损失,凭什么要我们买单?
先踩ie,它太过宽容了,以至于能够容忍代码书写人员的太多毛病,你css漏了一个单位,他正常显示,你页面少了结束标签,他正常显示,不知道这是放纵还是容错性好。
ff不一样,多个“#”或者少个“px”,它就给你脸色,告诉你,你代码不规范……似乎是在培养代码人员的严谨作风,生活也应该……(以下省去文字若干)
再说W3C,我目前对他的理解仅局限于web标准的前两个层次,结构标准和表现标准,ff好像比较好的做到了这点,而ie就不多说了。
w3c的动作比如用更有语义的strong代替b标签,抛弃<font>标签等等,为的是让代码更加规范化,更具有语义。现在越来越多设计人员开始抛弃表格布局页面的传统方式,并把结构语义话和代码语义话融入到页面设计制作中,这点足以证明大家已经慢慢接受w3c所提倡的东西,至于再深一层DOM之类的行为标准,不了解,也就不作评论……
不管w3c是处于政治目的还是什么其他,没去深究,至少站在设计人员的角度上,我觉得它提倡的web标准挺好……
这两个标准,大家倒是无甚异议的.现在讨论的DOM标准----它的DOM也算得上好吗?至于说到程序的兼容性,我就不大明白了.难道没有兼容和容错性的软件反而更好吗?
我再重复一遍,好的标准我赞成,不好的就反对.HTML的标准和CSS的标准好,我们就该支持;
DOM的标准不好,当然就该大力反对.
难道因为A标准好,就也要支持不好的B标准?这是什么逻辑,就因为是同一家公司出的?至于人家在探索中嘛,就等他们探索得足够好了,我们再支持吧.
而至于W3C因为与他人恶性竞争,因为可能给咱们带来麻烦,当然要大力抵制.关于兼容性嘛,任何一家公司也只是作浏览器这款软件而已,而无权也无义务去管他人的代码规范问题,别把自己想得那么伟大.
ie only的兼容性恰恰说明了IE好,FF烂.only不可以吗?别人烂,你也要陪着一起烂?
难道因为A标准好,就也要支持不好的B标准?这句我没说,你自己理解的,我的意思是人家有好有坏不要一味去看人家的缺点往死里踩!!!标准应该算是公平的,如果把ie的东西全定位标准,那还要W3C作甚么,一个ie足矣,定法律还要全民投票,这也是你自己说得,怎么能让ie说了算?ie功能强只是因为它发展的早,不经意间养成了众人的使用习惯,难道说发展的早就是好的,是对的?这是什么逻辑?不争了,没有结果的东西,大家看法各自有各自的角度,自己觉得好的就用,不好的就别用,这句最实用……
你自己对比一下IE的DOM里有多少东西,W3C里有多少?
一个连innerHTML都不支持的标准也叫好?如果W3C的DOM好的话,我自然是支持它,哪怕被迫用IE的标准也会支持它.
可现在恰恰相反,没多少人用它,也没多少人觉得它好,更没多少人支持它.