代码之家  ›  专栏  ›  技术社区  ›  tic

无法使用bookmarklet运行外部javascript

  •  5
  • tic  · 技术社区  · 15 年前

    对JS完全陌生。

    我需要使用一个外部脚本来修改当前页面中的一些元素,将其作为书签访问。

    如果修改网页的HTML源代码,请插入以下<script>行:

    s=document.createElement('script');
    s.type='text/javascript';
    s.src='script.js';
    document.getElementsByTagName('head')[0].appendChild(s);
    

    它工作得很好。但如果我用相同的行创建一个javascript:bookmarklet,我会得到一个带有以下字符串的空白页:

    [object HTMLScriptElement]
    

    但是,如果我创建一个书签,添加行

    void(null);
    

    对于前一个网页,网页不会解封,但脚本不会执行。

    为什么?

    1 回复  |  直到 15 年前
        1
  •  7
  •   Christian C. Salvadó    15 年前

    通常的做法是简单地使用一个自执行函数表达式,如下所示:

    (function () {
      var s=document.createElement('script');
      s.type='text/javascript';
      s.src='script.js';
      document.getElementsByTagName('head')[0].appendChild(s);
    }());
    

    书签:

    javascript:(function(){var s=document.createElement('script');s.type='text/javascript';s.src='script.js';document.getElementsByTagName('head')[0].appendChild(s);}());
    

    函数将返回 undefined (未提供返回值)阻止导航。

    还要注意,这将避免创建全局变量(如 s )它可以与页面上使用的其他变量重叠,因为所有变量都是在匿名函数的范围内创建的。