質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

4回答

4106閲覧

javascriptで外部ファイル(js、css)を一括登録する方法

cti1650

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2016/02/29 04:38

JavaScript初心者ですが、ローカルで使用するサイトを作成する際、ソースを極力短く済ませるために、外部ファイルを読み込む処理をjsファイルにまとめたいのですが、jQueryとjQuery mobileを読み込むと正常にサイトが表示されません。

一括登録にすることで、サイトの表示速度が遅くなるとは思いますが、今回は、簡潔にコードを記述することに重点を置いておりますので、下記のコードでの改善点等をご教示願います。

汚いコードで申し訳御座いませんが、宜しくお願い致します。

function viewportSet(){ var metalist = document.getElementsByTagName('meta'); var hasMeta = false; for(var i = 0; i < metalist.length; i++) { var name = metalist[i].getAttribute('name'); if(name && name.toLowerCase() === 'viewport') { metalist[i].setAttribute('content', 'width=device-width,initial-scale=1.0'); hasMeta = true; break; } } if(!hasMeta) { var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width,initial-scale=1.0'); document.getElementsByTagName('head')[0].appendChild(meta); } } function SetJSText(str){ var script = document.createElement('script'); script.appendChild(document.createTextNode(str)); document.body.appendChild(script); } function SetJSURL(url){ // var script = document.createElement('script'); // // Data URI // script.type = "text/javascript"; // script.src = url; // document.head.appendChild(script); $.getScript(url); } function SetCSSURL(url){ // var link = document.createElement('link'); // link.type = 'text/css'; // link.rel = "stylesheet"; // link.href = url; // document.head.appendChild(link); $("head").append("<link>"); var css = $("head").children(":last"); css.attr({ rel: "stylesheet", type: "text/css", href: url }); } function jQueryChk(){ //SetJSURL("//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"); } jQueryChk(); (function($) { SetCSSURL("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css"); SetJSURL("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"); })(jQuery);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2016/02/29 05:06

『正常にサイトが表示されません』とは具体的に言うと何が起こりますか? エラーメッセージなどご提示可能でしょうか。
cti1650

2016/02/29 05:30 編集

jQuery mobileのスタイルが正しく反映されず、エラーメッセージも表示されません。
guest

回答4

0

ベストアンサー

jQueryを使ってロードしている部分がありますが、jQueryを読み込む前に実行することは当然できません。

そして、jQueryChk();で正しくロードできたとしても、そのjQueryがJavaScriptから使えるようになるのは、続く無名関数ブロックを実行したです。

結論:jQuery本体も含めてJavaScriptからロードしたいなら、すべてjQueryを使わずに書くことをおすすめします。

投稿2016/02/29 05:11

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cti1650

2016/02/29 05:45

早速のご回答ありがとうございます。 質問のコードで言いますと、SetJSURL関数と、SetCSSURL関数のコメントアウトしている箇所の通りでは、間違いでしょうか? また、jQueryプラグインは、(function($){...})(jQuery)内で記述をすれば実行可能と言う事でしょうか? 重ねて申し訳御座いませんが、ご教示お願い致します。
maisumakun

2016/02/29 06:24

(その1)JS/CSSのロードは、コメントアウト内のコードで特に問題なさそうです。 (その2)jQueryを使ったコードを書く場合、jQueryの後にそのコードを含むファイルをロードさせるのが楽です(どうしてもしたくないなら、タイマーを回してjQueryがロードされたか監視する、というようなコードが必要で、このままただ無名関数を書くだけでは動きません)。
cti1650

2016/02/29 08:53 編集

下記のサイトを参考にしてjQueryを読み込むscriptタグにイベント処理を追加して待機させてプラグインを実行すれば、出来そうな気がしてきました。 JS備忘録:script要素でonload http://blog.mach3.jp/2010/03/21/js-script-onload.html function onloaded(e){ alert(e.target.src + " is successfully loaded"); } var ele = document.createElement("script"); ele.src = "hogehoge.js"; ele.onload = onloaded; ele.onreadystatechange = function(){ if(this.readyState=="loaded"||this.readyState=="complete"){ onloaded({type:"load", target:this}); } } document.body.appendChild(ele);
cti1650

2016/02/29 08:39

一度、ご教示頂いた事を反映してみます。 ご回答ありがとうございました。
guest

0

上記のプログラムをさらに改変しました。

外部JSファイル内で、下記の機能を実行可能にしました。

Setting.jQuery([url]) ・・・ jQueryファイルを読み込み(URL任意指定)

javascript

1// デフォルトで設定されているjQueryファイルを実行 2Setting.jQuery(); 3 4// 指定したURLのjQueryファイルを実行 5Setting.jQuery(url); 6

Setting.mobile([css],[js]) ・・・ jQuery mobileファイルを読み込み(css,jsURL任意指定)
Setting.ui([css],[js]) ・・・ jQuery uiファイルを読み込み(css,jsURL任意指定)

javascript

1// デフォルトで設定されているjQuery_uiファイルを実行 2Setting.jQuery().ui(); 3 4// 指定したURLのjQuery_uiファイルを実行 5Setting.jQuery().ui(css,js); 6

Setting.wr(str) ・・・ document.write(str)を実行

javascript

1// HTML読み込み途中で、タグを書き込み 2Setting.wr('<div></div>'); 3 4// 以下と同一 5document.write('<div></div>'); 6

Setting.css(arr) ・・・ CSSファイルを読み込み(URL,配列任意)
Setting.js(arr) ・・・ JSファイルを読み込み(URL,配列任意)
Setting.file(arr) ・・・ 外部ファイルを読み込み(URL,配列任意、css,jsファイルのみ実行可能)

javascript

1// 外部ファイルをURLを指定して読み込み 2Setting.css('./test.css'); 3 4// 複数の外部ファイルをURLを指定して一括読み込み 5var arr = [ './test1.css' , './test2.css' ] 6Setting.css(arr); 7

Setting.load(func) ・・・ window.onLoadイベント発生時に実行する処理を設定

javascript

1// HTML読み込み完了時の処理を追加 2Setting.load(function(){ 3 alert('test'); 4}); 5 6// 複数処理 追加可能 7Setting.load(function(){ 8 alert('test1'); 9}).load(function(){ 10 alert('test2'); 11}); 12

!!! 注意事項 !!!

  • Setting以降はメソッドチェーンが可能です。
  • 既にjQueryが定義されている場合は、

新たにjQueryを再定義する事は出来ません。

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <title>linkSetup</title> 5 <script type="text/javascript" src="linkSetup.js"></script> 6 <script type="text/javascript"> 7 $(function() { 8 ・・・jQuery 本文 9 })(); 10 </script> 11</head> 12<body> 13 <!-- ぺージ --> 14 <div data-role="page"> 15 <!-- ヘッダー --> 16 <div data-role="header"> 17 <h1>linkSetup</h1> 18 </div> 19 <!-- コンテンツ --> 20 <div data-role="content"> 21 <div class="ui-field-contain"> 22 <input type="file" id="fileItem" > 23 </div> 24 <div id="val"></div> 25 </div> 26 <!-- フッター --> 27 <div data-role="footer"> 28 <h4><div id="test"></div></h4> 29 </div> 30 </div> 31</body> 32</html>

javascript

1(function(){ 2 var Setting = (function(){ 3 var def = { 4 wr : function(str){ 5 str ? document.write(str) : ""; 6 return this; 7 }, 8 init : function(){ 9 return this.wr("<meta charset='UTF-8'>") 10 .wr("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />") 11 .wr("<meta name='viewport' content='width=device-width, initial-scale=1'>"); 12 }, 13 load : function (func){ 14 var oldload = window.onload; 15 if(typeof window.onload != 'function'){ 16 window.onload = func; 17 }else{ 18 window.onload = function(){ 19 oldload(); 20 func(); 21 } 22 } 23 return this; 24 }, 25 jQuery : function(URL){ 26 var _URL = URL ? URL : "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"; 27 return (typeof jQuery == "undefined") ? this.wr("<script type='text/javascript' src='"+_URL+"'></script>") : this; 28 }, 29 ui : function(css,js){ 30 var _ui = { 31 css : css ? css : "//ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css", 32 js : js ? js : "//ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js" 33 }; 34 return (typeof jQuery == "undefined") ? this.file([ _ui.css , _ui.js ]) : this; 35 }, 36 mobile : function(css,js){ 37 var _mob = { 38 css : css ? css : "//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css", 39 js : js ? js : "//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js" 40 }; 41 return (typeof jQuery == "undefined") ? this.file([ _mob.css , _mob.js ]) : this; 42 }, 43 js : function(urlarr){ 44 var item; 45 var vArr = (urlarr instanceof Array) ? urlarr : [ urlarr , ""]; 46 for (var i = 0; i < vArr.length; i++) { 47 item = vArr[i]; 48 item ? this.wr("<script type='text/javascript' src='"+item+"'></script>") : this; 49 } 50 return this; 51 }, 52 css : function(urlarr){ 53 var item; 54 var vArr = (urlarr instanceof Array) ? urlarr : [ urlarr, ""]; 55 for (var i = 0; i < vArr.length; i++) { 56 item = vArr[i]; 57 item ? this.wr("<link rel='stylesheet' href='"+item+"'>") : this; 58 } 59 return this; 60 }, 61 file : function(arr){ 62 var item; 63 var vArr = (arr instanceof Array) ? arr : [ arr, ""]; 64 for (var i = 0; i < vArr.length; i++) { 65 item = vArr[i]; 66 if (item.slice(-3) == ".js") { 67 this.js(item); 68 } else { 69 if (item.slice(-4) == ".css") { 70 this.css(item); 71 } 72 } 73 } 74 return this; 75 } 76 }; 77 return def.init(); 78 })(); 79 80 Setting.jQuery().mobile() 81 .load(function(){ 82 alert('test1') 83 }).load(function(){ 84 alert('test2') 85 }); 86})(); 87

投稿2016/03/01 14:47

cti1650

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

試しに以下の2通りで試してみました。

  • maisumakunさんの回答内容を反映したバージョン

以下の場合は、jQueryロード後、順次プラグインが実行されるため、
スタイルが適用される前の状態で一度表示され、スタイル適用までに1秒近く表示に時間がかかりました。

javascript

1(function(){ 2 var DoSet = 3 { 4 JSText : function(str){ 5 var script = document.createElement('script'); 6 // テキストノード 7 script.appendChild(document.createTextNode(str)); 8 document.body.appendChild(script); 9 }, 10 JS : function(url){ 11 var script = document.createElement('script'); 12 // Data URI 13 script.type = "text/javascript"; 14 script.src = url; 15 document.head.appendChild(script); 16 }, 17 CSS : function(url){ 18 var link = document.createElement('link'); 19 link.type = 'text/css'; 20 link.rel = "stylesheet"; 21 link.href = url; 22 document.head.appendChild(link); 23 }, 24 $JS : function(url){ 25 $.getScript(url); 26 }, 27 $CSS : function(url){ 28 $("head").append("<link>"); 29 var css = $("head").children(":last"); 30 css.attr({ 31 rel: "stylesheet", 32 type: "text/css", 33 href: url 34 }); 35 }, 36 WR : function(code){ 37 document.write(code); 38 } 39 }; 40 41 function doSetting(){ 42 DoSet.CSS("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css"); 43 DoSet.JS("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"); 44 } 45 46 var metalist = document.getElementsByTagName('meta'); 47 var hasMeta = false; 48 for(var i = 0; i < metalist.length; i++) { 49 var name = metalist[i].getAttribute('name'); 50 if(name && name.toLowerCase() === 'viewport') { 51 metalist[i].setAttribute('content', 'width=device-width,initial-scale=1.0'); 52 hasMeta = true; 53 break; 54 } 55 } 56 if(!hasMeta) { 57 var meta = document.createElement('meta'); 58 meta.setAttribute('name', 'viewport'); 59 meta.setAttribute('content', 'width=device-width,initial-scale=1.0'); 60 document.getElementsByTagName('head')[0].appendChild(meta); 61 } 62 63 var url = "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"; 64 var script = document.createElement('script'); 65 // Data URI 66 script.type = "text/javascript"; 67 script.src = url; 68 script.onload = doSetting; 69 script.onreadystatechange = function(){ 70 if(this.readyState=="loaded"||this.readyState=="complete"){ 71 doSetting(); 72 } 73 } 74 document.head.appendChild(script); 75})();
  • 速度重視で作成し直したバージョン

以下の場合は、HTML読込時に、随時反映されるため、
スタイル適応までに時間がかからず、
直接HTMLにSCRIPTタグを記述した時とほぼ変わらない表示速度で、
表示する事が出来ました。

更に、jsファイルのコードも簡略化出来ましたので、
こちらのバージョンを使用していこうと思います。

javascript

1(function(){ 2 var DoSet = 3 { 4 WR : function(str){ 5 str ? document.write(str) : ""; 6 return this; 7 }, 8 init : function(){ 9 return this.WR("<meta charset='UTF-8'>") 10 .WR("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />") 11 .WR("<meta name='viewport' content='width=device-width, initial-scale=1'>"); 12 }, 13 JS : function(url){ 14 return url ? this.WR("<script type='text/javascript' src='"+url+"'></script>") : this; 15 }, 16 CSS : function(url){ 17 return url ? this.WR("<link rel='stylesheet' href='"+url+"'>") : this; 18 } 19 }; 20 DoSet.init() 21 .JS("//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js") 22 .CSS("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css") 23 .JS("//ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"); 24})();

この度は、アドバイスを頂いた事で、別の角度からプログラムを見直す事が出来ました。
ご回答頂きました2人ともどうも有難う御座いました。

投稿2016/02/29 16:35

編集2016/03/01 14:44
cti1650

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

引数に渡している文字列のURLに
httpもしくはhttpsをつけてもダメでしょうか?

投稿2016/02/29 04:57

hato_pato

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cti1650

2016/02/29 05:36

ご回答ありがとうございます。 まだ試していなかったので、今晩試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問