打印

[兼容]刁钻的狐狸喜欢听歌剧(各种浏览器兼容问题请发这里)

本主题由 bound0 于 2008-1-2 13:56 解除置顶
以下引自ncs的帖子:
引用:
2.button
描述:
检查按下的鼠标键。

语法:
event.button

可能的值:
0 没按键
1 按左键
2 按右键
3 按左右键
4 按中间键
5 按左键和中间键
6 按右键和中间键
7 按所有的键
http://bbs.blueidea.com/viewthread.php?tid=273549

在ff中,则只会出现三个值:

 提示:您可以先修改部分代码再运行

浏览器检测

为了做到兼容各种浏览器,进行浏览器的检测是非常必要的。
在代码的最开始处进行浏览器检测,并形成一些标志性的全局布尔变量是一个策略。
复制内容到剪贴板
代码:
//browser detection stuff.
var isIE = ((userAgentStr.indexOf("msie") != -1) && (userAgentStr.indexOf("opera") == -1) && (userAgentStr.indexOf("webtv") == -1))? true:false;
var oldIE = (userAgentStr.indexOf("msie 5.0") != -1) || (userAgentStr.indexOf("msie 4") != -1) || (userAgentStr.indexOf("msie 3") != -1);
var    isGecko = (userAgentStr.indexOf("gecko") != -1)? true:false;
var    isSafari = (userAgentStr.indexOf("safari") != -1)? true:false;
var allowSafari = false;
var allowCamino = true;
var    isCamino = (userAgentStr.indexOf("camino") != -1)? true:false;
if (isCamino && userAgentStr.indexOf("1.0") == -1)
    allowCamino = false;
    
var    isKonqueror = (userAgentStr.indexOf("konqueror") != -1)? true:false;
var isOldSafari = isSafari;
if (isSafari)
{
    //Parse out the user string, look for the build number - anything above 412 is cool.
    var splits = userAgentStr.split('/');
    try {
    isOldSafari = parseInt(splits[splits.length-1]) < 412;
    }
    catch (e) { isOldSafari = true; } //Can't parse, assume the worst.
}
虽然这样做有其方便之处,但是现在我并不推荐这种策略。如果可以的话,尽量直接检测具体的脚本特性的可用性而不是检测浏览器版本。

[ 本帖最后由 bound0 于 2007-3-9 20:49 编辑 ]
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

拦截事件响应的通用代码

复制内容到剪贴板
代码:
function stopEvent(evt)
{
    if (evt.preventDefault)
    {
        evt.preventDefault();
        evt.stopPropagation();
    }
    else
    {
        evt.cancelBubble = true;
        evt.returnValue = false;
    }
}
可参考楼下:禁用右键菜单的通用代码。
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

禁用右键菜单的通用代码

复制内容到剪贴板
代码:
    if (isIE)
    {
        document.attachEvent("oncontextmenu", makeHandler(noContextMenu) );
    }
    else
    {
        document.addEventListener("contextmenu", makeHandler(noContextMenu), true);
    }
function noContextMenu(evt, target)
{
      if (isIE)
      {
        evt.cancelBubble = true;
        evt.returnValue = false;
      }
      else
        evt.preventDefault();
}
注:isIE 的含义见 楼上

[ 本帖最后由 bound0 于 2006-9-3 17:07 编辑 ]
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!

调整窗口大小的通用代码

复制内容到剪贴板
代码:
function SizeWindow(width, height)
{
    if (isIE)
    {
    window.resizeTo(width, height);
    var dx = width - window.document.body.offsetWidth;
    var dy = height - window.document.body.offsetHeight;
    window.resizeBy(dx, dy);
    window.dialogHeight = (parseInt(window.dialogHeight) + dy) + "px";
    window.dialogWidth = (parseInt(window.dialogWidth) + dx) + "px";
    }
    else
    {
      window.innerWidth = width;
    window.innerHeight = height;  
    }
}
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

TOP

接收键盘按压事件的通用代码

复制内容到剪贴板
代码:
    if (isIE)
        window.document.attachEvent("onkeypress", function (event) {keyPress(event);} );
    else
        window.document.addEventListener("keypress", keyPress, true);
        
function keyPress(key)
{
    if (key.keyCode == 27)
    alert("你想干吗!?");
}
注:isIE 的含义见 楼上
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

TOP

利用prototype.js来兼容FF和IE基础简例[原创]

第一 document.all.item的替换方式:
        document.all.item('id_name').className='class_name'
        替代方式1:
        document.all.id_name.className='class_name'
        替代方式2:
        $('id_name').className='class_name';

第二 取得value值
        var temp = document.all.item('id_name').value
        替代方式:
        var temp = $F('id_name');

第三 写入value值
        表单中写值
              $(form_name.id_name).value = temp ;
       表单外写值
              $(id_name).value = temp ;
       这样写是错误的:(错误说明:不能给对象的返回值赋值)
              $F('id_name') = temp ;

第四 写入className(class_name可为多个用空格分开)
       Element.addClassName('id_class','class_name');

第五 移除className(class_name只能为单一)
       Element.removeClassName('id_class','class_name');

第六 JS中变量名称于能与id_name重复

第七 例:
       <li id="huabei" onMouseDown="javascript:ctlist(event,'huabei')" class="li">测试</li>
       function ctlist(evt,ct){}
第八 例:
       <a href="javascript:toc(null,'测试')" class="searcha">测试</a>
       function tos(evt,temp){
        $('searchkey').value = temp;     //searchkey是在表单中的id
       }
第九 FF下alert()是错误的. 错误:没有足够的参数

第十 千万不能缺少id

十一 FF对js缓存清除困难,每次更新后最好重新打开一个FF

十二 识别浏览器
       var the_browser_name = navigator.appName ;
       if(the_browser_name == "Microsoft Internet Explorer"){
              alert("你使用的是IE");
       }
       if(the_browser_name == "Netscape"){
              alert("你使用的是FF");
       }

 提示:您可以先修改部分代码再运行
另外关于prototype.js的介绍能否再详细一些。利用别人写好的代码的确是一种可选的策略。

关于prototype.js的介绍  转载csdn

1. Prototype是什么?
或许你还没有用过它, prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端, 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。

如果你最近体验了这个程序包,你很可能会发现文档并不是它的强项之一。像所有在我之前的开发者一样,我只能一头扎进prototype.js的源代码中并且试验其中的每一个部分。 我想当我学习他的时候记写笔记然后分享给其他人将会很不错。

我也一起提供了这个包的对象,类,方法和扩展的 非官方参考 。

2. 通用性方法
这个程序包里面包含了许多预定义的对象和通用性方法。编写这些方法的明显的目的就是为了减少你大量的重复编码和惯用法。

2.1. 使用 $()方法
$() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。

比起DOM中的方法,这个更胜一筹。你可以传入多个id作为参数然后 $() 返回一个带有所有要求的元素的一个 Array 对象。下面的例子会向你描述这些。

<HTML><HEAD><TITLE> Test Page </TITLE><script src="prototype-1.3.1.js"></script><script>    function test1()    {        var d = $('myDiv');        alert(d.innerHTML);    }    function test2()    {        var divs = $('myDiv','myOtherDiv');        for(i=0; i<divs.length; i++)        {            alert(divs[i].innerHTML);        }    }</script></HEAD><BODY>    <div id="myDiv">        <p>This is a paragraph</p>    </div>    <div id="myOtherDiv">        <p>This is another paragraph</p>    </div>    <input type="button" value=Test1 onclick="test1();"><br>    <input type="button" value=Test2 onclick="test2();"><br></BODY></HTML>
这个方法的另一个好处就是你可以传入id字符串或者元素对象自己,这使得在创建可以传入任何形式参数的方法的时候, 它变得非常有用。

2.2. 使用$F()方法
$F()方法是另一个非常受欢迎的简写。它可以返回任何输入表单控件的值,如文本框或下拉框。 这个方法可以传入元素的id或者元素自己。

<script>    function test3()    {        alert(  $F('userName')  );    }</script><input type="text" id="userName" value="Joe Doe"><br> <input type="button" value=Test3 onclick="test3();"><br>
2.3. 使用Try.these()方法
Try.these() 方法使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易, 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行,返回成功执行的那个方法的返回值。

在下面的例子中, xmlNode.text在一些浏览器中好用,但是xmlNode.textContent在另一些浏览器中正常工作。 使用Try.these()方法我们可以得到正常工作的那个方法的返回值。

<script>function getXmlNodeValue(xmlNode){    return Try.these(        function() {return xmlNode.text;},        function() {return xmlNode.textContent;)        );}</script>
3. Ajax 对象
上面提到的共通方法非常好,但是面对它吧,它们不是最高级的那类东西。它们是吗?你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。

我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候,这个包如何让它更容易。

Ajax 对象是一个预定义对象,由这个包创建,为了封装和简化编写AJAX 功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看它们的一些。

3.1. 使用 Ajax.Request类
如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建XMLHttpRequest对象并且异步的跟踪它的进程, 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。

<?xml version="1.0" encoding="utf-8" ?><ajax-response>    <response type="object" id="productDetails">        <monthly-sales>            <employee-sales>                <employee-id>1234</employee-id>                <year-month>1998-01</year-month>                <sales>$8,115.36</sales>            </employee-sales>            <employee-sales>                <employee-id>1234</employee-id>                <year-month>1998-02</year-month>                <sales>$11,147.51</sales>            </employee-sales>        </monthly-sales>    </response></ajax-response>
用 Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。

<script>    function searchSales()    {        var empID = $F('lstEmployees');        var y = $F('lstYears');        var url = 'http://yoursever/app/get_sales';        var pars = 'empID=' + empID + '&year=' + y;       var myAjax = new Ajax.Request(                    url,                    {method: 'get', parameters: pars, onComplete: showResponse}                    );    }    function showResponse(originalRequest)    {        //put returned XML in the textarea        $('result').value = originalRequest.responseText;    }</script><select id="lstEmployees" size="10" onchange="searchSales()">    <option value="5">Buchanan, Steven</option>    <option value="8">Callahan, Laura</option>    <option value="1">Davolio, Nancy</option></select><select id="lstYears" size="3" onchange="searchSales()">    <option selected="selected" value="1996">1996</option>    <option value="1997">1997</option>    <option value="1998">1998</option></select><br><textarea id=result cols=60 rows=10 ></textarea>
你看到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse。

还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为true 或 false 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。

这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。

也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。

更完全的解释,请参照 Ajax.Request 参考 和 Ajax选项参考。

3.2. 使用 Ajax.Updater 类
如果你的服务器的另一端返回的信息已经是HTML了,那么使用这个程序包中 Ajax.Updater 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了,例子比我写说明的更清楚。

<script>    function getHTML()    {        var url = 'http://yourserver/app/getSomeHTML';        var pars = 'someParameter=ABC';         var myAjax = new Ajax.Updater('placeholder', url, {method: 'get', parameters: pars});    }</script><input type=button value=GetHtml onclick="getHTML()"><div id="placeholder"></div>
你可以看到,这段代码比前面的例子更加简洁,不包括 onComplete 方法,但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。

我们将加入更多的选项, 指定处理错误的一个方法。这个是用 onFailure 选项来完成的。

我们也指定了一个 placeholder 只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象, success (一切OK的时候被用到) 和 failure (有地方出问题的时候被用到) 在下面的例子中没有用到failure属性,而仅仅在 onFailure 处使用了 reportError 方法。

<script>    function getHTML()    {        var url = 'http://yourserver/app/getSomeHTML';        var pars = 'someParameter=ABC';        var myAjax = new Ajax.Updater(                    {success: 'placeholder'},                    url,                    {method: 'get', parameters: pars, onFailure: reportError});    }    function reportError(request)    {        alert('Sorry. There was an error.');    }</script><input type=button value=GetHtml onclick="getHTML()"><div id="placeholder"></div>
如果你的服务器逻辑是返回JavaScript 代码而不是单纯的 HTML 标记, Ajax.Updater对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript,你只需在最后参数的对象构造方法中简单加入evalScripts: true属性。

更完全的解释,请参照 Ajax.Updater 参考 和 Ajax选项参考 。

[ 本帖最后由 lipengadmin 于 2006-9-6 12:06 编辑 ]
花火博客www.flowerflame.com

TOP

onload的不同适用范围



 提示:您可以先修改部分代码再运行
ff下,script可以触发onload事件,ie则不能.
相关帖子:http://bbs.blueidea.com/thread-2677092-1-1.html

[ 本帖最后由 bound0 于 2006-10-19 17:45 编辑 ]

TOP

请教IE和FIREFOX下的区别 w3c标准

大家好,最近我做了一些页面在IE中可以正常浏览显示,可在FIREFOX中非常难看,好多CSS样式都变了,FF中JAVASCRIPT控制台的提示,诸如“text-indent”"margin-left"这些东东我根本没应用,他们的意思就是文本缩进,中间内容与边距的距离,和ie对照也没应用这样的效果,W3C标准,看了一些书,不太了解,请各位,交流一下,IE与FIREFOX下CSS JAVASCRIPT 的区别和怎么解决问题,或提供一些相关资料,MSN HOUZX@CNCBZ.COM QQ 407822165 谢谢了,
www.haocaicheng.com 耗材世界

TOP

这不是标准的问题。这是两种浏览器的解释问题,, 在盒模型的解释上 IE跟FF截然不同。还有一个最重要的地方。。你说你很多没有定义他们的 margin什么的,这就是问题的根本;
因为你没有定义的话。浏览器会使用他们内置的style,而这个内置的style IE跟FF是有区别的。
你可以实验一下 写一个页子,body里面只有下面这句 (dtd肯定要加的啦。)

<h1 style="background-color:#eee">1111</h1><p style="background-color:#cf0">1111111</p>


你可以分别在IE跟FF下面看看他们的 margin情况和padding情况。。以及字体大小情况。。你就会明白了。。
有区别的不是标准。
有区别的是浏览器对标准的解释。

TOP

还有DOCTYPE的问题

TOP

不同浏览器的事件支持列表

三个月前的文章了……没ie7……
http://www.quirksmode.org/js/events_compinfo.html
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~

TOP

Firefox中有对应的currentStyle对象吗?

FF中好像没有currentStyle对象....不知道有没有跟这功能相像的对象?

TOP

回复 #43 itlover 的帖子

http://bbs.blueidea.com/thread-2643108-1-1.html

[ 本帖最后由 bound0 于 2006-11-24 16:15 编辑 ]
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~

TOP

js创建xml代码,请帮忙修改一下FF兼容吧

在网上找了一段代码,可惜FF浏览器不兼容,帮忙看看吧,谢谢!

 提示:您可以先修改部分代码再运行
希望世界上只有一种浏览器

TOP

回复 #45 Drifter 的帖子

这里是兼容的代码:

 提示:您可以先修改部分代码再运行
[ 本帖最后由 bound0 于 2006-11-28 09:34 编辑 ]

TOP

ie6,ie7,ff在解释ul的margin怎么解决哦?

如题
ie6,ie7,ff在解释 ul 的margin怎么解决哦?
具体代码看一下 http://www.baomanyi.com
在ie6,ff下还可以 ie7 下就有些字看不到了

TOP

回复 #47 rosetrap 的帖子

他们默认的解释不一样,但你用CSS控制了之后应该是一样的.
比如:
复制内容到剪贴板
代码:
ul{
   margin:0;padding:0;list-style:none;
}
[ 本帖最后由 bound0 于 2006-11-30 11:54 编辑 ]

TOP

谢了哦~~
其实我 margin :0px;padding:0px 都设了 就是list-style:none 没试~

TOP

如何用JS在OPERA中实现自定义右键?

平常针对(IE)document.oncontextmenu和(FireFox)document.contextmenu进行重定义后就可以显示自己想显示的菜单.
代码类似这样(IE):
<script>
document.oncontextmenu = function(){ document.getElementById('myPopupMenu').visibility='visible';}
</script>
但今天才发现,这种方式在OPERA中无效,不知哪位高人能否指点一下在OPERA中应该如何定义?

TOP

回复 #50 hp999 的帖子

嗯,比较遗憾的告诉你。。opera默认是不允许程序检测右键的。。。。。

因为opera的开发者认为鼠标右键属于重要的可访问性元素(而且据说满多的opera使用者也支持这一个决定),所以默认并不允许检测右键。

不过你可以在它的菜单(工具-》首选项-》高级-》内容-》javascript选项)中“允许脚本检测右键单击”,这样应该就可以开启了。。

另外:opera下的onload判断也和一般的不同。。。

所以你可以看dojo里的实现,它对于opera中右键的处理是和mac一致的(ctrl+left click)。

[ 本帖最后由 bound0 于 2006-12-5 22:03 编辑 ]
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~

TOP

我也来发一个

在IE中inertRow()和insertCell()后面的index参数可以省略,
但是在FF中不能省,如果要在最后插入,需要填写-1

 提示:您可以先修改部分代码再运行

TOP

问ie和mozilla的javascript引擎之间的区别

下面的代码在ie中运行的结果是正则表达式在偶数次循环时失效,奇数次时正常
firefox下一切正常...

 提示:您可以先修改部分代码再运行
这是什么原理?很是不解...

于是修改成下面这样,每次重新创建正则表达式对象,这回ok了

 提示:您可以先修改部分代码再运行
有人了解ie的javascript引擎嘛,这算不算是个bug?  通常来说ie的javascript引擎容错性更好,没想到这次被耍了 -_-

只知道mozilla使用的javascript引擎叫做rhino,不知道ie的叫啥?

TOP

没见过关于浏览器或脚本引擎的内部资料
经验是这样的,在ie里,带全局标志的正则表达式对象在每次test之后,其内部会记录成功匹配的位置,下一次调用时将从此位置之后开始
居处恭 执事敬 与人忠

TOP

确实是这样,全局标志多余了

jscript参考手册提到一个lastIndex属性,可以在每次匹配成功之后设置为0,下次便可以从头查找 - -

mozilla的lastIndex总是为0...

[ 本帖最后由 farOasis 于 2007-3-10 17:15 编辑 ]