YangFan.net

Tag : javascript Search in Google

神奇的JavaScript (2)

  今天又看到一个,和上次那个是同一个人做的,这次是Mario赛车,完成度比上次更高,连对手AI都有!
2008-05-23 23:15 | Category : Blog | Comments (4)

神奇的JavaScript

  JavaScript能做什么?现在看来真的是只有想不到没有做不到……点击这里看看,看完之后我再也不敢说自己会JavaScript了。这个东西还是开源的,有空可以读一下源码
2008-04-13 13:00 | Category : Blog | Comments (3)

去除Godaddy免费空间的广告

  康神发现在Godaddy注册域名是送免费空间的,还带php和mysql,可以架空间玩,不过又发现这个免费空间是带广告的,很让人不爽。它这个加广告的方法是在每个html页面(似乎根据Content-Type判断)加上一段代码:</object> </layer> </span> </div> </table> </body> </html> <!-- adsok --><script language='javascript' src='https://a12.alphagodaddy.com/hosting_ads/gd01.js'> </script>。最后那个js所做的事情是在你的<body>最开始加一段广告,前面那堆标签是为了防止你用开放的标签搞掉他的script。于是每次打开页面之后就会出现一个广告。
  最先想到的办法是用body的onload把他放广告的东西搞掉,这个很简单,直接把他生成的iframe弄个style.display='none'或者style.height='0px'就可以了。但是很不幸的是这样虽然最后是没广告了,中间却有一段时间是能看到广告的,如果网速慢的话,可以看到的时间很长。另外,他的js里很恶心地设置了body的margin和padding,这样原来设计的页面就变样了。所以这个办法是不可接受了。
  接下去有两条路解决这个问题,一是用标签套掉,让他不执行这个js,一个是在它前面放一段js让他的js失效。幸运的是,两种方法都可行。
  用标签套掉比较简单。虽然广告代码写了一堆标签闭合来防止这个方法,但是他忘记了pre和iframe。经测试,半个pre标签在这里是无效的,js照样执行了,而半个iframe却很完美,加个<iframe style='display:none;'>在</body>之后,广告就彻底蒸发了。这个方法优点是简单,非常简单,缺点是尽管看不到了,但是其实广告加载还是执行了,速度很慢(js加载不慢,但是js又去搞个广告代码下来就慢了)。
  于是需要研究放点代码让他js失效的问题。先看他的js代码,发现并不是任何时候都显示广告的,当你的域名后缀是.mobi的时候就不显示,原因也许是对mobi域名的推广,也许是怕广告把手机浏览器搞崩。不过不管怎样,这至少留下了一个斩草除根的方法。首先想到的是写个和他的判断函数同名参数也一样的函数在前面,这样他函数定义的时候会出错然后调用的是我的函数,返回个true给他就可以了。结果实验之后发现JavaScript在这种情况下不会报错,而会直接用后面的函数覆盖了前面的!只能另辟蹊径。他用了String.search来判断document.domain中是不是有".mobi",显然document.domain是不能乱改的(不是不想改,是改不掉),那就改String.search吧。写个函数String.prototype.search = function(a,b){ return 1; }在它前面重载一下,这下世界真的清净了,广告那段恶心还巨大的HTML代码压根不会被生成了。另外,这样的重载不会影响在它之前的JavaScript,所以在</body>后面做这个事情,不会破坏页面上原来的东西。
  这两个方法,或者它们的改进,应该能适合其他各种会在最后给你加广告代码的服务。

  Update:其实不用iframe而用<noscript>也能起作用,而且更加干净,连他的js都不会加载。但是这样很容易被godaddy的自动监测发现,把空间给砍了。
2007-04-21 00:27 | Category : Blog | Comments (13)

[询问]opera里用javascript怎么取消文字选取?

需求:
  用JavaScript代码取消页面上的文字选取
实现方法:
  IEdocument.selection.empty();
  FireFoxwindow.getSelection().removeAllRanges();
  Opera:Opera对这两个都不支持,确切的说,document.selection只有IE支持,window.getSelection()也只有FireFox和Safari支持,都不是标准语法。搜索了一下发现Opera支持用document.getSelection()获得选中的文字(FireFox也支持),但是typeof一下返回的是个string而不是一个像window.getSelection()那样的DOM:Selection对象(DOM:Selection对象貌似是FireFox自己的标准),这样就没法进行写操作了。在网上无论怎么搜都找不到解答,但我觉得应该一定有办法的。
2006-12-24 22:12 | Category : Blog | Add Comment

简单的功能,复杂的实现

  想在HTML里实现一个很简单的功能,就是在<a>标签被点击的时候,执行一个javascript函数。然后发现,居然在IE6,Opera9和FireFox2三种浏览器里,实现方法还不一样。
  当然,通用实现是存在的,即<a href="javascript:dosth(p,q);">xxx</a>,这样所有浏览器都能认识。可是我不想这么写,因为这样的话鼠标移上去状态栏就会出现我的函数名,很难看。于是换一种写法<a onclick="dosth(p,q);">xxx</a>。更简洁了是吧?可是问题就接踵而至了。
  首先,不带href<a>在IE6里是不能触发:hover的css的,也就是说原来鼠标移上去的效果没了,这应该和IE6不支持div:hover这样的写法是一个毛病,这个不难解决,加一个href="#"就可以了,反正在FireFox和Opera里都不会因此出错。
  真正的麻烦从这里开始了:我的<a>标签不是直接写在html里面的,而是用javascript生成的。这部分代码很简单:
   act="dosth(p,q);";
   i=document.createElement("a");
   with(i) {
    setAttribute("href","#");
    onclick=act;
   }
  结果呢,在Opera里运行正常,而在IE和FireFox里,居然都不执行dosth(p,q)的函数!跟踪分析发现,这俩浏览器不支持onclick这么写——但是也不报错。既然不支持,那就写成onclick=new Function(act);,这时候IE和Opera正常,FireFox依旧不认。改用setAttribute("onclick",act);好了,这下Opera和FireFox倒是都认识了,正确执行了,而且用FireFox好用的查看部分源代码功能可以看到输出是完全正确的(貌似只有FireFox提供了这个强大而实用的功能,其他浏览器都不能看执行结果的代码)。但是IE,却不执行dosth(p,q)函数,仿佛根本不存在一样——而直接在html里按这样的href+onclick属性书写是没有问题的。
  最后反复调试,还是解决不了问题,没办法,只能用最无奈的方法,判断浏览器,然后对人说人话,对鬼说鬼话了。如果是IE和Opera就执行onclick=new Function(act);如果是FireFox,就执行setAttribute("onclick",act);
  这好端端的一个简单功能,非要整得这么麻烦,唉。
  更新@11.23:原因找到了,非常简单,不要在with(i)里面写onclick=new Function(act);,直接在外面写i.onclick=new Function(act);,就搞定了。这也许是FireFox的一个Bug,但是触发条件未知,因为我做一个简单的页面代码单独测这个是可以pass的……
2006-11-21 02:13 | Category : Blog | Comment (1)
Subscribe Atom
  • Subscribe to google
  • Subscribe to bloglines
  • Subscribe to zhuaxia
Search
License
  • Creative Commons Lisence
Copyright © 2011 Yang Fan. Powered by Fomalhaut 1.0b.