如何在运行时从自身获取javascript书签的来源?

时间:2015-10-03 01:32:59

标签: javascript bookmarklet

我的书签是JavaScript书签。例如:

javascript:alert('hi');

我希望能够从书签本身获取当前运行的JavaScript书签的来源,所以在伪代码中:

javascript:alert(currentlyExecutingScript.text);

哪会警告

javascript:alert(currentlyExecutingScript.text);

我该怎么做?我更喜欢跨浏览器解决方案,但仅使用Chrome特定解决方案就完全没问题了!

为什么我对此感兴趣?因为我正在写一个引用自己的书签。

3 个答案:

答案 0 :(得分:4)

由于location是指当前网页的网址,并且JavaScript书签不会更改location,因此在任何当前浏览器中都无法做到这一点。

但是, 可以在JavaScript中执行您想要的操作:

javascript:void function f(){alert(f.toString())}()

这将alert以下内容:

function f(){alert(f.toString())}

toString()方法在函数上调用时,返回表示函数源代码的字符串(参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)。

信用

@SergeSeredenko建议使用void

  

使用立即调用的函数表达式时,可以使用void强制将function关键字视为表达式而不是声明。
   - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void#Immediately_Invoked_Function_Expressions

答案 1 :(得分:0)

你可以用一个字符串写一个你的脚本,用一个邪恶的eval来执行它,脚本有一个自己的引用:

javascript:var script = "alert('hi'); alert(script)";
eval(script);

它会警告" hi",然后是script的内容。

答案 2 :(得分:0)

最简单但最明确的最安全的实现方法是将代码存储在字符串中,并在单击书签时评估该字符串。

var code = "alert('Hi');var num = 988;alert(num + 12)";
//code contains the code you wish to run
eval(code);
//runs the code.
alert(code); 
//alerts the code.

我会非常小心使用eval()函数。

有关详细信息,请参阅this SO question