JavaScriptの質問です。

▼以下のページは国旗(英/スペイン/日本)の画像をクリックすると、Google翻訳を使って閲覧中のページが国旗の言語に自動翻訳されるコードです。
http://cherenkov.hp.infoseek.co.jp/tmp/sample/translate2.shtml
日本の国旗をクリックすると元のページに戻ります。
Firefox,Safariでは期待通りの動作をするのですが、IE6~8は、日本の国旗をクリックするとURLの末尾に「undefined」の文字列が自動的に追加され、404エラーとなってしまいます。
IE6~IE8でもFirefox等と同じように「undefined」を追加させない方法は何かありませんでしょうか?
お知恵をお借りできれば幸いです。
なおこの質問は▼こちらの質問の派生質問です。詳細コードはこちらをご覧になってみてください。
http://q.hatena.ne.jp/1267371986

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2010/04/20 22:39:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.3

回答回数1504ベストアンサー獲得回数493

ポイント500pt

前回の回答 にある translator.js を以下のように書き換える。

// Google翻訳のページから抜ける。
var orgAdrs = /&u=(.+)&rurl=/.exec(location);   // <- 変更
orgAdrs = orgAdrs ? unescape(orgAdrs[1]) : "#"; // <- 追加
document.write('<a href="' + orgAdrs + '" target="_top"><img src="./ja.png" style="border:0;" alt="日本語のページに戻る"></a> ');
id:icta

ご回答ありがとうございます。

こちらのコードで完全に希望通りの動作を確認できました。

お手軽に設置できて、簡単に翻訳できてしまうこのコードは重宝しそうです。

本当にありがとうございました。

2010/04/20 22:38:50

その他の回答2件)

id:GreenStar No.1

回答回数192ベストアンサー獲得回数46

ポイント300pt

translator.js の下から2行目にある baseURI の部分を location.toString() に代えてください。

id:icta

ご回答ありがとうございます。

早速試してみたのですが、私の環境ではうまく動作しないようです。

別件ですが、http://q.hatena.ne.jp/1271446360でご回答いただいたときにポイントを付けることができませんのでしたのでこちらからポイントを付けさせていただきます。ありがとうございました。

2010/04/20 22:35:38
id:hanako393 No.2

回答回数1142ベストアンサー獲得回数87

Javascriptの変数のどれかが、undefinedでなってます。

それを修正すべきです。

id:icta

ご回答ありがとうございます。

残念ながら変数の問題ではなかったようです。詳しくはコメント欄をご確認ください。

2010/04/20 22:37:09
id:Cherenkov No.3

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント500pt

前回の回答 にある translator.js を以下のように書き換える。

// Google翻訳のページから抜ける。
var orgAdrs = /&u=(.+)&rurl=/.exec(location);   // <- 変更
orgAdrs = orgAdrs ? unescape(orgAdrs[1]) : "#"; // <- 追加
document.write('<a href="' + orgAdrs + '" target="_top"><img src="./ja.png" style="border:0;" alt="日本語のページに戻る"></a> ');
id:icta

ご回答ありがとうございます。

こちらのコードで完全に希望通りの動作を確認できました。

お手軽に設置できて、簡単に翻訳できてしまうこのコードは重宝しそうです。

本当にありがとうございました。

2010/04/20 22:38:50
  • id:GreenStar
    前回に引き続き間接回答拒否のままですね。
    コメント欄だと評価も付かないのでさびしいです。

    今回はヒントだけにしておきます。
    window.document.baseURI
    baseURI は IE系では使えません。変わりに・・・を使います。

  • id:icta
    GreenStarさん、回答ありがとうございます。
    よくわからないのですが「間接回答拒否」とは何でしょうか?
    特に何もしていないはずなのですが・・・
    何か質問のときに選択に誤りがあるようでしたら修正しますので方法を教えていただけませんでしょうか?
    よろしくお願いいたします。
  • id:icta
    GreenStarさん、質問をもう一度最初から試したみたのですが、▼「12歳以下のユーザーからの回答を受け付けない」にチェックがデフォルトで入っていました。これを外して質問すれば回答できるようになりますか?
    ●回答者制限回答者制限について
    回答者1人につき○件まで回答を受け付ける
    12歳以下のユーザーからの回答を受け付けない
  • id:emily2nd
    >ictaさん
    回答拒否されているのは、日頃の行いが悪いからです。無視した方が良いですよ。
  • id:emily2nd
    >emily3315 emily3845 emily2ndのように複数のアカウントを用いて他者に対して嫌がらせを行う者がおり

    事実無根の誹謗中傷です。通報しました。
  • id:icta
    GreenStarさん、教えていただいたURLをクリックしてみると▼以下のようになっておりました。
    ●他ユーザーの設定による回答拒否
    他ユーザーの設定による回答拒否 「1ヶ月以内に10名以上から回答拒否されているユーザーの回答を拒否する。」
    「~20名以上から~」が設定できる最大値のようなのでこちらに変更し直しました。
    教えていただきありがとうございました。
  • id:GreenStar
    早速回答させていただきました。

    お手数おかけしたわりに、非常にあっさりした回答で申し訳ないのですが、簡潔に表しました。
    コメントをにぎわせてしまった事、非常に申し訳なく思っております。
  • id:Cherenkov
    前回の回答のテスト不足申し訳ございません。
    「変わりに・・・」がわからないのでコメント欄に。
    var orgAdrs = decodeURIComponent(window.document.baseURI);
    の部分を、
    var orgAdrs = /&u=(.+)&rurl=/.exec(location);
    orgAdrs = orgAdrs ? decodeURIComponent(orgAdrs[1]) : decodeURIComponent(location);
    とすればIEでも正しく動作すると思います。
  • id:Cherenkov
    回答1は間違っています。
  • id:Cherenkov
    >GreenStarさん
    嫌味ではなくこの方法を提案した者の責任として見届けたかっただけです。お気を悪くされたのなら申し訳ないです。

    iframeの中の翻訳される前のURLを取得するためにbaseURIを使いました。
    location.toString()では解決しません。
  • id:icta
    GreenStarさん、ご回答ありがとうございます。
    早速試してみたのですが、私の環境ではうまく動作ないようです。
    英国旗で英訳したあと、日本国旗をクリックしても原文ページにはもどらず、英訳ページから遷移しません。
    なお検証はIETesterを使ってIE6~8で確認してみました。

    Cherenkovさん、ご無沙汰しております。その節は大変お世話になりました。
    早速教えていただいたコードに変更しました。
    その結果、1)の場合はうまくいくのですが、2)の場合は「デコードするURIは有効なエンコーダではありません。」という新たなエラーが出てしまいます。このエラーはURLエンコードを含むページに移動するときに表示されます。
    1)URLが英数字だけのもの
    2)URLに%83e%83X%83gのようなURLエンコードを含むもの

    何かよい解決策はないものでしょうか?お手すきのときに検証いただければ幸いです。
  • id:hatake-kakasi
    hatake-kakasi 2010/04/20 17:58:30
    さんざん大騒ぎをしたあげく、ウソの回答とは、いやはや・・・
  • id:Cherenkov
    うーん。。
    decodeURIComponentをunescapeに替えるだけじゃ直りませんよね?
    実際にエラーがでるページを用意して頂ければ分かる人が答えてくれるかもしれません。
  • id:Cherenkov
    <head>に
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    を入れるとどうかな。。
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1436494069
  • id:icta
    Cherenkovさん、ご回答ありがとうございます。

    >decodeURIComponentをunescapeに替えるだけじゃ直りませんよね?

    早速試してみました。
    IE7とIE8は「英」⇔「日」可能になりました。
    IE6は「英」をクリックすると「終了していない文字列型の定数です」というエラーが表示されます。
    このエラーは簡単に直せるものでしょうか?

    あと1点気になる点があります。
    オリジナルページの状態で、「日」クリックをすると2)の場合にのみ「%83e%83X%83g」が「□□□s」のように変換されてしまいます。オリジナルページで「日」がクリックされた場合、何もしないというようにすることはできないでしょうか?
    1)URLが英数字だけのもの
    2)URLに%83e%83X%83gのようなURLエンコードを含むもの

    >エラーがでるページを用意して頂ければ分かる人が答えてくれるかもしれません

    これができれば良いのですが、使用しているプログラムを公開することが残念ながらできないのです。
    本当に申し訳ないです。

    ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">を入れるとどうかな。。

    これで思い出したのですが、Google翻訳には以下のような文字コードのパラメーターがありました。
    「&ie=UTF-8 文字コード」
    UTF-8、Shift_JIS、sjisで試したのですが結果は同じでした。
    サイトの文字コードをすべてUTF-8にすれば解決すると思うのですが、残念ながら現状のShift_JISを変更することができない状態です。

    もし何か他にお気づきになりましたらお時間あるときにでも教えていただければ幸いです。
  • id:Cherenkov
    >オリジナルページで「日」がクリックされた場合、何もしない
    var orgAdrs = /&u=(.+)&rurl=/.exec(location);
    orgAdrs = orgAdrs ? unescape(orgAdrs[1]) : "#";
    または、
    orgAdrs = orgAdrs ? unescape(orgAdrs[1]) : "javascript:void(0);";
    でどうでしょうか。


    やはり最初に言った通り、例外的な使い方は止めたほうが・・・。

    オフトピですがjQueryのプラグインでGoogle Ajax Language APIを使ってiframeを使わずダイナミックに翻訳できるものを見つけました。
    http://charlesmarshall.co.uk/jquery/2010/01/24/jquery-translator.html
    あとIE6はあの世へ旅立たれたのでそっとしておくのがいいかもしれません。
    http://www.itmedia.co.jp/news/articles/1003/08/news030.html
  • id:icta
    Cherenkovさん、ご回答ありがとうございます。
    教えていただいたコードで完全に希望通りの動作を確認できました。
    またjQueryのプラグインもなかなか良さそうですね。
    ただ軽さと設置の容易さでは今回のコードに軍配を上げたいと思います。

    IE6氏がすでにお亡くなりになっていたとは知りませんでした。
    氏の残した功績を忘れることはありませんが、これで新しい世代が活躍できる機会が拡がりそうですね。
    本当にいろいろお世話になりました。

    もし差し支えなければポイントを付けて終了したいと思います。
    簡単なもので結構ですので回答をご入力いただければ幸いです。

  • id:doumoto
    IE6は森繁のように生き続けてるよ( ̄ー ̄)。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません