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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

3回答

10582閲覧

webで大量の文字のレンダリング終了後に処理をする方法

MasakazuFukami

総合スコア1869

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2015/04/18 11:07

大量の文字をレンダリングした後に処理をする方法をお聞きしたいです。

通常ならば、

コードの読み取り終了後なら、

lang

1$(function(){ 2 alert('loaded'); 3})

ソースファイルも含めた全ファイルの読み込み終了後なら

lang

1$(window).ready(function(){ 2 alert('loaded'); 3})

という風に書くことで実装できると思うのですが、

ソースファイル内に大量の文字が入っているとうまく動作しないようです。
具体的には
フレームワーク:ruby on rails
で簡略化したhtmlを書くと

lang

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>text</title> 6</head> 7<body> 8 <%= text %> 9 <script> 10 $(function(){ 11 alert('レンダリング終了'); 12 }); 13 </script> 14</body> 15</html>

このような感じで書いているのですが、実際に表示するとアラートが出た後でもスクロールやクリックなどのイベントを行なうことが出来ません。
予想としてはDOM自体は読み込んでいるのが、レンダリングが終了していないからではないかと考えております。

ちなみに、body内の<%= text %>には16万文字くらいの文字が入ります。

テキストのレンダリング終了時の取り方をご存知のかたがいらっしゃったらご教授お願い致します。

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

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

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

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

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

guest

回答3

0

offsetTop,offsetLeft等のプロパティにアクセスした場合、強制的に要素をレンダリングしその結果を返します。
これを利用して、レンダリング後に処理を行うような処理を組めるかもしれません。

JavaScript - Webフロントエンドに従事するお前らはいい加減高頻度イベントとレイアウトとスタイリングの付き合い方を考えろ - Qiita
JavaScript - 仮想DOMに思いを馳せていたらそもそもブラウザのレンダリングがわかってなかった - Qiita

このような感じで書いているのですが、実際に表示するとアラートが出た後でもスクロールやクリックなどのイベントを行なうことが出来ません。

上記のプロパティは、レンダリング終了後に結果を返す必要があるため、それまで処理をブロックします。
このため、上記のプロパティへアクセスした後、該当の処理を行えば解決するかもしれません。

ただ、「レンダリング終了時に処理を行う」のではなく、「レンダリングを終了させてその後に処理を行う」ので、パフォーマンス等を検証する必要があると考えます。
また、ブラウザの内部処理に依存している都合上、ブラウザによっては上手く動作しない可能性があります。

投稿2015/04/19 06:31

sounisi5011

総合スコア697

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

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

MasakazuFukami

2015/04/19 06:38

おぉ!こんな方法があるんですね!! すごく勉強になりました! ありがとうございます!
sounisi5011

2015/04/19 06:39

ブラウザに依存するので、よく検証してください。
guest

0

アラートが出た後でもスクロールやクリックなどのイベントを行なうことが出来ません。

一つ質問なのですが、上記のスクロールやクリックのイベントを行うというのは
alert の表示中に行っているのでしょうか?
JavaScript はシングルスレッドなので、
alert を表示しているとユーザーの入力待ち状態で止まりますが、それが原因ということではないですか?

投稿2015/04/18 13:17

PruneMazui

総合スコア227

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

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

退会済みユーザー

退会済みユーザー

2015/04/18 13:29

>> アラートが出た後でもスクロールやクリックなどのイベントを行なうことが出来ません。 > 一つ質問なのですが、上記のスクロールやクリックのイベントを行うというのは alert の表示中に行っているのでしょうか? もっとも、 <script> $(function(){ alert('レンダリング終了'); }); </script> は、ただの即時実行関数なのでalertが出た後操作できなかったとしても当たり前なんですけどね…
MasakazuFukami

2015/04/19 02:05

Prune masui様 回答遅くなってしまいました! 申し訳ございません! alertに関してはalertが出てOKを押してアラートウインドウが閉じた後もスクロールやクリックが出来ないです。。。 lucker様 僕の理解不足で大変恐縮なのですが、 $(function(){ alert('レンダリング終了'); }) という文字を読み込むまでにtextを全て読むこむ?(文字列として全部認識する)必要があると思っていたのでalertが出た時は<%= text %>を全て読み込んでいると思っていました。
退会済みユーザー

退会済みユーザー

2015/04/19 02:16

$(function(){ alert('レンダリング終了'); }) は、即時関数なので、構文解析がそこまで行った段階で実行されます。ドキュメントのレンダリングが終わっていなくても、そこまで行けば実行されてしまいます。
MasakazuFukami

2015/04/19 02:24

なるほど。。。 ありがとうございます!
guest

0

jQuery使っていいのであれば。

$(document).ready();

を利用してはいかがでしょうか?

http://learn.jquery.com/using-jquery-core/document-ready/

Code included inside $( document ).ready() will only run once the page Document Object Model (DOM) is ready for JavaScript code to execute.

$( document ).ready()内に書かれたコードは、JavaScriptコードでDOMを操作する準備が完了してから1度だけ実行されます。

投稿2015/04/18 12:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MasakazuFukami

2015/04/18 12:20

ご回答ありがとうございます! ただこれでは、ready()内の処理を行った後も画面のレンダリングを待っているような感じ(スクロールやクリックイベントが効かない)になってしまいました(´;ω;`)
退会済みユーザー

退会済みユーザー

2015/04/18 12:44

ready()はDOMの表示が完了した後のはずなので、なんか、別の問題のような気がするんですが… 16万字ですか… 検証してみるか…
退会済みユーザー

退会済みユーザー

2015/04/18 13:09

PHPで申し訳ないですが、普通に動作しますね。 <?php $text = ""; for($i=0; $i<16000;$i++){ $text .= "あいうえおかきくけこ<br>"; } echo <<< EOL <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>text</title> <script src="/__com/libraries/jquery-1.11.1/js/jquery-1.11.1.min.js"></script> <script> (function($){ $(document).ready(function(){ console.log('レンダリング終了'); $('html,body').animate({scrollTop: $("#hoge").offset().top},'slow'); }); })(jQuery); </script> </head> <body> {$text} <input type="button" id="hoge" value="hoge"> </body> </html> EOL;
退会済みユーザー

退会済みユーザー

2015/04/18 23:27

<%= text %> これ、JavaScriptのテンプレートエンジン使っているなんてオチではないですよね?
MasakazuFukami

2015/04/19 02:06

検証ありがとうございます! 普通に出来るんですね(´;ω;`) javascriptのテンプレートエンジンは使用していません! railsのみです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問