Bookmarklet是一个书签(bookmark),这个书签的内容是一段JavaScript脚本。点击这个书签,可以注入JavaScript到当前页面,从而可以作为一个插件使用。
通常是通过一个匿名函数注入JavaScript代码。这样做的目的是防止注入的脚本有返回值。如果有返回值的话,浏览器会被重定向到返回值所指向的页面,而这通常不是我们所期望的。
javascript:(function(){alert('hi')})()
通常是赋值语句会造成bookmarklet的返回值。对于较短的语句,也可以使用void语句。比如:
javascript:void(document.links[0].href='http://noyesno.net/');
有两个可能的原因会让开发者希望注入JavaScript文件而不是直接代码。
javascript: (function(){ var js=document.createElement('script'); js.type='text/javascript'; js.charset='utf-8'; js.src='http://noyesno.net/.../file.js'; document.body.appendChild(js); } )()
你的脚本要用到jQuery API,而原页面可能已经包含了jQuery,又或者你想直接引用某些CDN上的jQuery脚本。对此,主要是解决两个问题:
javascript: if (typeof jQuery == 'undefined') { var js = document.createElement('script'); js.type = 'text/javascript'; js.onload=my_main_func; js.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'; document.body.appendChild(js); } else { my_main_func(); } function my_main_func() { // ... }
TODO