JS - 修改Google Translate的书签

时间:2013-05-08 17:02:07

标签: javascript bookmarklet google-translate

此页面提供与Google翻译http://translate.google.com/translate_buttons一起使用的书签,但这些书签在同一标签/窗口中打开Goog​​le翻译并替换原始页面。如何修改bookrmarklet代码(见下文)在新窗口/标签中打开?还有人可以简要地解释代码实际上在做什么。非常感谢。

javascript: var t = ((window.getSelection && window.getSelection()) || (document.getSelection && document.getSelection()) || (document.selection && document.selection.createRange && document.selection.createRange().text));
var e = (document.charset || document.characterSet);
if (t != '') {
    location.href = 'http://translate.google.com/?text=' + t + '&hl=en&langpair=auto|en&tbb=1&ie=' + e;
} else {
    location.href = 'http://translate.google.com/translate?u=' + encodeURIComponent(location.href) + '&hl=en&langpair=auto|en&tbb=1&ie=' + e;
};

编辑: 根据@DG。我已将代码修改为以下工作解决方案:

javascript: var t = ((window.getSelection && window.getSelection()) || (document.getSelection && document.getSelection()) || (document.selection && document.selection.createRange && document.selection.createRange().text));
var e = (document.charset || document.characterSet);
if (t != '') {
    window.open('http://translate.google.com/?text=' + t + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e)
} else {
    window.open('http://translate.google.com/translate?u=' + encodeURIComponent(location.href) + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e)
};

但是这会在新标签页中打开Goog​​le翻译,如果您想在新窗口中打开Goog​​le翻译,则需要传递更多参数window.open():

javascript: var t = ((window.getSelection && window.getSelection()) || (document.getSelection && document.getSelection()) || (document.selection && document.selection.createRange && document.selection.createRange().text));
var e = (document.charset || document.characterSet);
if (t != '') {
    var url1 = 'http://translate.google.com/?text=' + t + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e;
    window.open(url1, '_blank', "GoogleTranslate", "height=200,width=200")
} else {
    var url2 = 'http://translate.google.com/translate?u=' + encodeURIComponent(location.href) + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e;
    window.open(url2, '_blank', "GoogleTranslate", "height=200,width=200")
};

只有一个问题,我已经意识到在谷歌浏览器中它正在按预期工作。但在FF 18.0.2中它还用空白替换原始页面显示:“[对象窗口]”和URL栏包含整个脚本,如何避免这种情况,并保持原始页面显示,而不需要返回一页?

EDIT2: 好的我已经知道了,asi在这里建议:what is the [object Window]?我添加了void(0);在scipt的末尾。

javascript: var t = ((window.getSelection && window.getSelection()) || (document.getSelection && document.getSelection()) || (document.selection && document.selection.createRange && document.selection.createRange().text));
var e = (document.charset || document.characterSet);
if (t != '') {
    var url1 = 'http://translate.google.com/?text=' + t + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e;
    window.open(url1, '_blank', "GoogleTranslate", "height=200,width=200")
} else {
    var url2 = 'http://translate.google.com/translate?u=' + encodeURIComponent(location.href) + '&hl=en&langpair=auto|sk&tbb=1&ie=' + e;
    window.open(url2, '_blank', "GoogleTranslate", "height=200,width=200")
};
void(0);

干杯

2 个答案:

答案 0 :(得分:1)

在两个地方将location.href = '...'更改为window.open('...')

小书签代码只是检查用户是否选择了页面上的任何文本,然后在新的URL中使用该文本。我的建议将修改代码,从更改位置到打开新窗口。

答案 1 :(得分:0)

为什么不直接将翻译栏添加到页面?如果页面还没有包含翻译栏(div.skiptranslate中的iframe),那么它会等到它看到通过注入翻译javascript加载的google.translate.TranslateElement函数,然后调用它来绘制工具栏。

(function () {
  function loadJS(url, callback) {
    var s = document.createElement('script');
    s.src = url;
    if (s.addEventListener) {
      s.addEventListener('load', callback, false);
    } 
    else {
      s.onreadystatechange = function () {
        if (this.readyState == 'complete') {
          callback();
          s = null;
        }
      }
    }
    s.type = 'text/javascript';
    document.getElementsByTagName('head') [0].appendChild(s);
  };
  loadJS('https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit', function () {
    window.setTimeout(doTrans, 100);
  });
})();

function doTrans()
{
  if (!document.querySelector("div.skiptranslate")) {
    if (typeof google != "undefined" && typeof google.translate != "undefined" && typeof google.translate.TranslateElement != "undefined")
      new google.translate.TranslateElement({layout:google.translate.TranslateElement.InlineLayout.SIMPLE,autoDisplay:true},null);
    window.setTimeout(doTrans, 100);
  }  
}
相关问题