人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Tumblrのオリジナルスキンを制作しております。
AutoPagerizeを使用しているのですが、2ページ目以降にJavaScriptが適用されません。
2ページ目以降もJavaScriptを動かすためにはどのようにすればいいでしょうか?
ご教授宜しくお願いします。
なお、使用しているJavaScriptはTumblrのビデオの横幅を500px以上に設定するためのものです。以下参照。
--------------------------------------
<script type="text/javascript">
$(document).ready(function() {
var embedTag;
$('div.video').each(function(index) {
$( this ).contents().each( function ( index ) {
if ($(this).is('object') || $(this).is('embed') || $(this).is('iframe')) {
var orgWidth = $(this).attr('width');
var orgHeight = $(this).attr('height');
var scale = orgHeight/orgWidth;
var targetWidth = 700;
var targetHeight = targetWidth * scale;
$(this).attr('width', targetWidth);
$(this).attr('height', targetHeight);
}
});
});
});
</script>
--------------------------------------

●質問者: kaemhatti
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●200ポイント ベストアンサー

こちらが参考になると思います。
http://os0x.hatenablog.com/entry/20090829/1251556449

Tumblr 専用で良いのであれば、AutoPagerize の addFilter を使う方法かな?




追記です。

実際に動かしてませんから、自信があまり無いのですが、こんな感じになると思います。

$(document).ready(function() {
 // 質問にあったコードから、$(document)ready で実行する部分を切り出してます
 var change_video_size = function(ctx) {
 // jQuery 関数で、第2引数 (context) を追加してます
 $('div.video', ctx).each(function() {
 $(this).contents().each(function() {
 // 省略
 ...
 });
 });
 };

 // まず、ページ読込が完了したら、一回実行
 change_video_size(document);

 // AutoPagerize のフィルターにも、サイズ変更の関数を登録する
 if (window.AutoPagerize) {
 window.AutoPagerize.addFilter(function(docs) {
 for (var i = 0 ; i < docs.length ; ++i) {
 change_video_size(docs[i]);
 }
 });
 }
});




またまた、追記です。

Tumblr 専用の autopager だってことで、回答のコメントにあったスクリプトを読んでみました。
次ページの処理をした後に、任意の関数を呼ぶような仕組みが無いので、DOMNodeInserted イベントを監視することになると思います。
こんな感じになるのではないかと思います。

$(document).ready(function() {

 var change_video_size = ...

 change_video_size(document);
 // と、ここまでは、前と同じ

 // DOMNodeInserted のイベントを監視する
 if (tumblrAutoPager) {
 tumblrAutoPager.pp.addEventListener('DOMNodeInserted',function(evt){
 change_video_size(evt.target);
 }, false);
 }
});

どんな要素が追加されるのか、よく分からないのですけれど、本当は条件を付けて絞り込んだ方が良いのかも。
tumblrAutoPager.pp は、ページを挿入する先の要素が入っているはずです(ソースを読み違えていなければ)。




さらに追記です。

autopager の初期処理と前後するためにエラーになっているように思います。
イベントリスナーの登録をリトライするようにしてみました。

$(document).ready(function() {

 var change_video_size = ...

 change_video_size(document);
 // と、ここまでは、前と同じ

 // DOMNodeInserted のイベントを監視する
 if (tumblrAutoPager) {
 function add_ev() {
 if (tumblrAutoPager.pp) {
 tumblrAutoPager.pp.addEventListener('DOMNodeInserted',function(evt){
 change_video_size(evt.target);
 }, false);
 console.log("※ DOMNodeInserted listener added !");
 } else {
 setTimeout(add_ev, 0);
 }
 }
 setTimeout(add_ev, 0);
 }
});

addEventListener に成功すると、ログに一行出力するようにしてます。
ページの読み込みが完了して、ちょっと経つと、そのログが出てるはずです(出て欲しい)。
その後に、二ページ目を表示するとどうなるでしょうか?

# 何度もすみません (^^


kaemhattiさんのコメント
回答ありがとうございます。このサイト迄はたどり着いたのですが、Javascript初心者のため上のコードを実行するJavascriptの書き方がわかりません。もし可能でしたら記入例等提示して頂けると幸いです。Tumblr専用で大丈夫です。

a-kuma3さんのコメント
>> Javascript初心者のため上のコードを実行するJavascriptの書き方がわかりません。 << あら、そうなんですか。 質問にコードが書いてあったので、jQuery の方は大丈夫な方かと思ってました。 回答に追記しました。 実際に動かしてないので、きちんと動くかどうかは自信が無いんですけど...

kaemhattiさんのコメント
ご回答ありがとうございます。ご呈示頂いたコードで試してみたのですが、やはり2ページ目以降が動作しませんでした。貼付けたコードは以下です。この記述で合っていますでしょうか? >|javascript| $(document).ready(function() { var change_video_size = function(ctx) { $('div.video', ctx).each(function( index ) { $(this).contents().each(function( index ) { if ($(this).is('object') || $(this).is('embed') || $(this).is('iframe')) { var orgWidth = $(this).attr('width'); var orgHeight = $(this).attr('height'); var scale = orgHeight/orgWidth; var targetWidth = 700; var targetHeight = targetWidth * scale; $(this).attr('width', targetWidth); $(this).attr('height', targetHeight); } }); }); }; change_video_size(document); if (window.AutoPagerize) { window.AutoPagerize.addFilter(function(docs) { for (var i = 0 ; i < docs.length ; ++i) { change_video_size(docs[i]); } }); } }); ||<

a-kuma3さんのコメント
最初に表示されたときにはビデオのサイズは変わってるってことですよね。 であれば、change_video_size の中身はあってるってことだよなあ。 フィルターに起動がかかっているかどうか、ログを仕込んで確認してみますか。 >|javascript| // AutoPagerize のフィルターにも、サイズ変更の関数を登録する if (window.AutoPagerize) { console.log("※has AutoPagerize"); // ※ window.AutoPagerize.addFilter(function(docs) { console.log("※called AutoPagerize Filter. " + docs.length); // ※ for (var i = 0 ; i < docs.length ; ++i) { console.log("※AutoPagerize add : " + i + " : " + docs[i].tagName); // ※ change_video_size(docs[i]); } }); } ||< ログは、どこで見るか分かりますか?

kaemhattiさんのコメント
Firebugにてコンソール確認したのですが、何も表示されないのでフィルターが起動していないと思われます。 ちなみに、AutoPagerizeは以下のjsを使っております。 http://static.tumblr.com/q0etgkr/J5bl3lkz1/tumblrautopagernopage.js ご教授宜しくお願いします。

a-kuma3さんのコメント
ああ、[http://autopagerize.net/:title=AutoPagerize] ではなく、Tumblr 専用の autopager があるってことですね(道理で、かみ合わないと思った)。 というわけで、回答に追記してみました。

kaemhattiさんのコメント
お伝えしておらず申し訳ございませんでした。 追加して頂いたコードで試してみたのですが、やはり2ページ目以降動作しませんでした。 ログには、"TypeError: tumblrAutoPager.pp is null" とのエラーメッセージがあります。 何か解決方法はありますでしょうか? 宜しくお願いします。

a-kuma3さんのコメント
>> ログには、"TypeError: tumblrAutoPager.pp is null" とのエラーメッセージがあります。 何か解決方法はありますでしょうか? << ああ、そうか。tumblrAutoPager.init() が走る前に、イベントリスナーの登録が動いちゃうんだな... ちょっと考えます。

a-kuma3さんのコメント
イベントリスナーの登録をリトライするようにしたコードを、回答に追記しました。

kaemhattiさんのコメント
お返事遅くなってしまい申し訳ございません。 できました!!ありがとうございます! 解決できず途方に暮れていたので本当に助かりました。 丁寧に回答して頂きありがとうございました。 本当に感謝しております。今後とも宜しくお願いします。

a-kuma3さんのコメント
なんとか、解決に至ったようで、こちらもほっとしました。 もう少し、腕を磨いておきます (^^;
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ