簡體   English   中英

Javascript bookmarklet在某些網站上失敗,創建了ghostly new <html> 頁

[英]Javascript bookmarklet fails on certain sites, creates ghostly new <html> page

我注意到我的Javascript bookmarklet在某些網站上失敗了,比如谷歌閱讀器和谷歌搜索結果頁面(並在一些非谷歌網站上隨機出現)。 看一下控制台,我可以看到,對於這些頁面,單擊bookmarklet並沒有像往常那樣將元素附加到頭部/主體,而是創建了一個如下所示的新文檔:

<html>
  <head></head>
  <body></body>
</html>

即使我將我的書簽縮小為javascript:alert(window.location.href); 它將創建此空白頁面並在其中運行書簽,以便警報顯示about:blank 在大多數網站上,不會創建此空白頁面並顯示正確的位置。

有人可以解釋一下嗎? 這些沙盒外部網站是否將代碼作為安全措施?

更新 :我目前無法在Chrome 17.0.932.0 dev以外的瀏覽器上重現這一點。 如果其他人可以在Chrome或其他方面重現這些結果,請與我們聯系。

你需要確保最頂層的代碼,即javascript:后面的代碼javascript:不返回任何內容。

通常這是通過將所有內容包裝在void()

javascript:void(alert(window.location.href));

雖然因為函數本身沒有返回任何東西,但它與alert()打破是很奇怪的...

我認為這是Google Chrome中的一個錯誤,我已將其歸檔到他們的錯誤數據庫: https//bugs.webkit.org/show_bug.cgi?id = 72606

如果javascript: url返回一個字符串,它將用於創建一個新文檔:

javascript:'foo bar baz';

如果您不知道要注意它,這可能是一個難以調試的問題。 如果您使用返回字符串的函數或使用設置字符串值的行結束書簽,則可以突然顯示:

javascript: a = prompt('foo bar baz'); b = a;

一個簡單的解決方案是使用一個閉包:

javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}());

另一種方法是以void 0;結束void 0;

javascript: a = prompt('foo bar baz'); b = a; void 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM