Javascript Bookmarklet适用于Chrome / Safari,但不适用于Firefox / IE

时间:2012-08-09 00:01:12

标签: javascript internet-explorer firefox bookmarklet

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

  

[object HTMLScriptElement]

bookmarklet就是这个(最后的所有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中它甚至不会改变它所在的任何页面。

我确实尝试将自由执行的函数表达式中的bookmarklet包装为suggested elsewhere,但这只是导致了 Chrome控制台中的Uncaught SyntaxError: Unexpected token ((没有别的)。这是我如何包装它:

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实际执行书签,我需要更改什么?

1 个答案:

答案 0 :(得分:1)

小书签不得返回任何内容。只需删除return s;行即可。

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