CGI::Applicationで、IE6のときだけXML宣言を消すHTMLを生成する
スポンサードリンク
Windows IE6は、XML宣言があると後方互換モードでレンダリングされる不具合があるので、標準準拠モードにするにはXML宣言を取っ払う必要がある。他のブラウザはそういう問題がないので、XML宣言つけておきたい。というときに、CGI::Applicationで、能動的にプラウザの種類によって吐き出すHTMLを変えてやろうという魂胆です。
CGI::Applicationでは、cgiapp_postrunで、吐き出す寸前のコンテンツを書き換えることが出来るので、ここで、ブラウザがIE6で、かつContent-Typeがtext/htmlの時だけ、XML宣言を取っ払うコードを書いておけばOK。
CGI::Application::Plugin::BrowserDetectが初めて役に立ちました。
#!/usr/bin/perl package main; my $webapp = WebApp->new(); $webapp->run(); package WebApp; use base 'CGI::Application'; use strict; use warnings; use CGI::Application::Plugin::BrowserDetect; sub cgiapp_postrun { my $self = shift; # WinIE6の時にXML宣言を外す my $output_ref = shift; my $b = $self->browser; if ( ({$self->header_props()}->{'-type'} eq 'text/html') && ( ( $b->windows ) && ( $b->ie ) && ( $b->major < 7 ) ) ) { $$output_ref =~s/<\?xml .+\?>\n?//so; } } sub setup { my $self = shift; $self->start_mode('start'); $self->run_modes( start => 'start', ); $self->header_add( -type => 'text/html', -charset => 'UTF-8' ); } sub start { my $self = shift; my $tmpl_html = << 'END_OF_HTML'; <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>test</title> <meta http-equiv="content-script-type" content="text/javascript" /> <meta http-equiv="content-style-type" content="text/css" /> <link rel="index" href="/" /> <link rev="made" href="mailto:hoge@example.com" /> </head> <body> <p> IE6だとXML宣言消えているよ。 </p> </body> </html> END_OF_HTML my $t = $self->load_tmpl( \$tmpl_html ); return $t->output; }
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2453
コメントする