初めての店舗開業を成功させよう>>

以下の記述
<script src="…">★</script>
で★の部分に「値」を書くことによって外部JSファイルに値を渡せるようです。がどう受け取るのかが判りません。

★に記述するのはあくまでも値です。「var a = "…";」等の式ではありません。具体的にはGoogle+の「+1 ボタン」の設置の際のコードで

<script src="https://apis.google.com/js/platform.js" async defer>
{lang: 'ja'}
</script>

のように記述します。こうすると「Google でおすすめする」となり、「{lang: 'en'}」とすると「Recommend this on Google」となります。(反映されたのはIE11。Chromeでは効かない)

なので少なくともIEではオブジェクトの受け渡しができているようです。

script要素でsrcを書くときにも閉じタグが必須である理由が今までわからなかったのですが、このためなのかなと今更ながらにカルチャーショックを受けました。

一応ググってみたのですが、グローバル領域に変数を定義してしまう方法や、クエリパラメータで指定する方法ばかりがヒットしてしまい、上記の方法に関する情報は見つけられませんでした。

https://apis.google.com/js/platform.js
を丁寧に読めば判るはずですが、コードが圧縮されていて非常に読みにくくなっており断念してしまいました。

<script src="…">★</script>
で★の部分に「値」を書いてそれを外部JSファイルで受け取る方法を教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。


方法はNo1様が回答した通りと推測します。

ごく簡単な例を・・・
<test.js>
(function(){
 var s = document.getElementsByTagName("script");
 var obj = JSON.parse(s[s.length-1].innerHTML);

 var i, txt = "";
 for(i in obj)
  txt += i + " = " + obj[i] + "<br>";

 document.getElementById("result").innerHTML = txt;
})();


<html>
<!DOCTYPE HTML>
<html lang="ja">
<head><title>TEST</title></head>
<body>

<div id="result">result</div>

<script type="text/javascript" src="test.js">
{
"hoge": "hogehoge",
"fuga": 111,
"piyo": 222
}
</script>
</body>
</html>
    • good
    • 0
この回答へのお礼

ソースをきちんとは解析できていないのですが以下のあたりの

k.___gu=b}var b=Ub("cu"),e=q.scripts||q[pa]("script")||[],d=[],f=[];f[F][E](f,Ub("us"));for(var g=0;g<e[I];++g)for(var h=e[g],l=0;l<f[I];++l)h.src&&
0==h.src[H](f[l])&&d[F](h);0==d[I]&&0<e[I]&&e[e[I]-1].src&&d[F](e[e[I]-1]);for(e=0;e<d[I];++e)d[e][M]("gapi_processed")||(d[e][v]("gapi_processed",!0),(f=d[e])?(g=f.nodeType,f=3==g||4==g?f.nodeValue:f.textContent||f.innerText||f.innerHTML||""):f=void 0,(f=Yb(f))&&b[F](f));a&&(d={},Xb(d,a),c[F](d));

scripts, q[pa]("script"), src, innerText, innerHTML
等のキーワードから確かにそうっぽいですね。特に
q=document
pa="getElementsByTagName"
という定義があるので。

わざわざサンプルを作成していただき、ありがとうございました。Chromeでも動くことが確認できました。(でも、だとするとgoogle+ボタンの設置で、なぜChromeでは効かないのか謎ですが)

引数を渡す仕組みがあるのかと思っていたのですが、そうではなく独自にがんばっていただけということでちょっと拍子抜けしてしまいました。

しかし参考になりました。ありがとうございました

お礼日時:2014/10/21 15:38

DOMで、src属性のあるscriptタグの中身を順に見ているのだと思います。

    • good
    • 0
この回答へのお礼

なるほど。そういうことですか。
引数を渡せる仕組みが用意されているわけではないのですね。

ちょっと拍子抜けしてしまいました。
参考になりました。ありがとうございました

お礼日時:2014/10/21 15:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QHTMLファイル同士での値渡し

困っています。

HTMLファイルからHTMLファイルへ移動するときに、
HTMLファイル1でJavaScript で算出された値を
HTMLファイル2へ渡して使用したいのです。

showModalDialogだとダイアログにしか渡せないし・・・。
このように、値をそのまま次のページに渡すための方法を教えてください。
お願いします。

Aベストアンサー

すみません。うっかりしてました。

document.write(FORM[v1]);
では、v1を変数と認識してしまうので、エラーになってしまいますね。

document.write(FORM.v1);  // 「FORM.v1」です
あるいは
document.write(FORM["v1"]);
としてください。

QjspからServletを呼び、元のjspページに戻るにはどうしたらよいですか?

・jspページにあるボタンを押すとServletに値を渡す。
・Servletで処理をする。
・処理の結果を元のjspページに表示する。

というプログラムを作りたいと考えています。
jspページ→Servletで処理をする、という所までは出来たのですが
その後元のページに戻すというところで困っています。

jspページは複数(十数ページ)あり、Servletは1つです。
a.jsp→Servlet→a.jsp
b.jsp→Servlet→b.jsp
このように、どのjspページから呼ばれても、元のjspページに
戻したいのですが、どのようにすれば実現できるでしょうか?

Aベストアンサー

doGetメソッドなら
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class サーブレット名 extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
res.sendRedirect(new URI(req.getHeader("referer")).getPath());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
(JDKやサーバーなどの環境、eclipse等を使用しているかなど、詳しく書いたほうがいいですよ^^!ロジック自体はもっといいものがあるかどうか検討してみてください。sendRedirectメソッドはリクエスト属性を保持しないので、必要な場合はRequestDispatcher#forwardメソッドの使用も考えられます。その場合はパスの記述が/アプリ名/ファイル名ではなく/ファイル名 になりますが(余談))

doGetメソッドなら
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class サーブレット名 extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
res.sendRedirect(new URI(req.getHeader("referer")).getPath());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
(JDKやサーバーなどの環境、eclipse等を使用しているかなど、詳し...続きを読む


人気Q&Aランキング

おすすめ情報