在浏览器控制台中运行JavaScript与bookmarklet
我尝试运行一个简单的代码来替换JS中HTML页面主体中的字符串在浏览器控制台中运行JavaScript与bookmarklet,javascript,google-chrome-devtools,bookmarklet,developer-tools,Javascript,Google Chrome Devtools,Bookmarklet,Developer Tools,我尝试运行一个简单的代码来替换JS中HTML页面主体中的字符串 document.body.innerHTML = document.body.innerHTML.replace(/foo/g,"bar"); 上面的代码在浏览器控制台中运行良好(在Firefox和Chrome中进行了测试),但当我通过前缀为JavaScript:的JavaScript bookmarklet运行相同的代码时,页面会断开,失去所有样式元素 我只是好奇为什么代码的行为会有所不同,因为我认为在控制台或通过bookma
document.body.innerHTML = document.body.innerHTML.replace(/foo/g,"bar");
上面的代码在浏览器控制台中运行良好(在Firefox和Chrome中进行了测试),但当我通过前缀为JavaScript:
的JavaScript bookmarklet运行相同的代码时,页面会断开,失去所有样式元素
我只是好奇为什么代码的行为会有所不同,因为我认为在控制台或通过bookmarklet运行的JS代码将在同一环境中运行。实现这一点的最简单方法是在位置栏中键入
javascript:“Hello world”
。请注意,页面内容已被替换,即使您没有触摸DOM
这是因为bookmarklet的返回值被传递给页面内容(如果存在)。在本例中,(document.body.innerHTML=document.body.innerHTML.replace(/foo/g,“bar”)
计算为新的innerHTML
1。它只是文档主体的innerHTML
,因此在替换整个文档HTML时stle信息会丢失
这样做要好得多:
javascript: ( function(){document.body.innerHTML = document.body.innerHTML.replace(/foo/g,"bar") }()
它还有一个额外的好处,那就是将所有的var
s私有化。或者你可以加上一个返回false
按@diegog的建议添加到bookmarklet
一,。不是
未定义的
,在Javascript中,相等运算符也会返回值,这让那些键入错误的人非常恼火 如果分配的返回值正在替换页面内容,则会发生什么情况。您可以在末尾添加“returnfalse”来避免它。