【问题标题】:Javascript Bookmarklet Works in Chrome/Safari but not Firefox/IEJavascript 书签适用于 Chrome/Safari 但不适用于 Firefox/IE
【发布时间】:2025-06-12 06:15:01
【问题描述】:

我有一个 JavaScript 小书签,在 Chrome (v21) 和 Safari (v6) 中运行良好,但是当我尝试在 Firefox (v14) 或 IE (v9) 中使用它时,我得到一个页面,上面写着:

[对象 HTMLScriptElement]

书签是这样的(所有 PHP 语句末尾插入 API 密钥):

javascript: (function(src, cb) {
var s = document.createElement('script');
s.charset = 'UTF-8';
document.body.insertBefore(s, document.body.firstChild);
s.src = src;
if (typeof cb === 'function') {
    s.onload = cb;
    s.onreadystatechange = function() {
        (/loaded|complete/).test(s.readyState) && cb(s);
    };
}
return s;
}('http://towatchlist.com/marks/bookmarklet2response?uid=<?php echo $userID; ?>'))​

我认为它甚至根本不会加载书签。在 Firefox 中,URL 栏变为上面的代码;在 IE 中,它甚至不会从它所在的任何页面改变。

我确实尝试将小书签包装在一个自动执行的函数表达式中,如suggested elsewhere,但这只是导致 Uncaught SyntaxError: Unexpected token ( 在 Chrome 控制台中(仅此而已)。我是这样包装的:

javascript: (function() {
function(src, cb) {
    var s = document.createElement('script');
    s.charset = 'UTF-8';
    document.body.insertBefore(s, document.body.firstChild);
    s.src = src;
    if (typeof cb === 'function') {
        s.onload = cb;
        s.onreadystatechange = function() {
            (/loaded|complete/).test(s.readyState) && cb(s);
        };
    }
    return s;
}('http://towatchlist.com/marks/bookmarklet2response?uid=<?php echo $userID; ?>')
}());​

也许我没有把它包装好?无论如何,为了让 IE/Firefox 真正执行书签,我需要进行哪些更改?

【问题讨论】:

  • 在一行中调试javascript代码并不容易......
  • @Johnny5 很公平;我通过 TidyUp 把它传回来了,现在它读起来好多了。谢谢。

标签: javascript internet-explorer firefox bookmarklet


【解决方案1】:

书签不得返回任何内容。只需删除 return s; 行,你应该会很好。

更一般地说,您可以将整个内容(或更准确地说是最后一条语句)包装在 void() 函数调用中,以确保没有返回值。

【讨论】:

  • 谢谢,我只需要取出返回线。
  • 当代码已经被包装在一个立即调用的函数表达式(也就是自执行匿名函数)中时,不需要void。我从未见过将它与void 技术一起使用,这样做可能看起来有点奇怪和多余。只需删除 return 即可。