久々にJSをごりごり使ってハマったメモ。
jQueryとか便利ですね。
1. FireFoxでhtmlにオーバーレイしたFlashのボタンが押せなくなる
htmlにFlashをオーバーレイさせた上で、scrollbarをhiddenにすると、Flashのボタンが非常に押しづらくなる。
window.open()でスクロールバーなしで開いた場合や、そもそもスクロールバーが出ない場合は問題なし。
2. Safariはスクロールバーがないと、scrollのイベントが取得できない。
(jQueryの$(window).scroll() 使ってるから?)
3. OperaはjQueryのScrollToライブラリでスクロールしない
指定のエレメント上でのスクロールはできるけど、$.scrollTo($('#hoge'), 1000) とかやっても動かない。
4. jQuery 1.3.3 でOpera9.5のwindowのサイズが取れない
$(window).height()とかやるとやたらでかいサイズが返る。
document.compatMode を見つつ、document.documentElement.clientWidth やら document.body.clientWidth やらを返す。
互換とか、標準とかなんかよくわからないけどメンドイ。
吐き出してるRSSを取得するのにPHPにてfile()関数を使って取得してたけどどうも取得できないサイトがある.いろいろ調べたら
[Request Header] Accept-Encoding: gzip,deflate [Response Header] Content-Encoding: gzip
そこでfsockopen()関数を使用してリクエストヘッダーにてContent-Encodingを渡さないようにした.
$req_message = "GET /index.html HTTP/1.1 ";
$req_message .= "HOST: graffiti-web.org\r\n";
$req_message .= "\r\n";
fsockopen('graffiti-web.org', 80, $errno, $errstr, 5);
fputs($handle, $req_message);
socket_set_timeout($handle, 5);
$response = '';
while(!feof($handle)) {
$response .= fgets($handle, 4096);
}
header('Content-type: text/plain');
print $response;
fclose ($handle);
これってPHPの設定かなんかでfile()関数でもできるのかな?
以前書いたJSの呼び出しているGETのクエリーを取り出す方法で書いたときに自身のスクリプトタグはgetElementById()を使用して使っていたけど,いい方法見つけた.
IT戦記 | とてもシンプルに自分自身が属する script 要素を取得
んー,なるほどー.
jsファイルにおいて
<script src="~.js?id=100" />
var scriptsTag = document.getElementById('idname');
var srcAttr = scriptsTag.getAttribute('src');
var id = srcAttr.split('?')[1].split('id=')[1];
alert(id);
なるほどー!
AJAXでWhat's Newを再度作ってみた.
前回のと違って今回はLoJAX (Low-technology AJAX)を使用して作ってみた.
LoJAX What's New
といっても,responseTextをdivタグのしたに流し込んでいるだけなのであれですが,MacIE5.xでは文字化けしちゃいます...
なんでだろう...
そもそもLoJAXを使用してデータが取れるのはいいんだけど,MacIE5ではresponseXMLとしてDOMが確立されてなくresponseTextにテキストが入っただけの状態で返ってくるのでDOMのメソッドを用いたデータの取得ができない...
となると正規表現とかで取得するとかでしょうか?
でも,そもそも文字化けしてるし...
あきらめるしかないかな…?
/**
* 読み込むことでBlogの最新記事とTOPICSを指定のオブジェクトへ表示させる
* <code>showTopics()</code>メソッドを提供する.
* {@link http://www.brothercake.com/site/resources/scripts/lojax/ lojax}を使用して
* Mac IE5以降でも動作するように実装したがなぜか文字化けを起こす...
*
* @link http://www.brothercake.com/site/resources/scripts/lojax/
* @usage <pre>
* <body onload="javascript:showTopics();">
* </pre>
* と,bodyタグのonloadイベントハンドラにて呼び出す.
* @author nao seto (seto@graffiti-web.org)
*/
/**
* windowオブジェクトへのエイリアス.
*
* @param window
*/
var target = this;
/**
* TOPICSのXMLへのパス.
*
* @param String
*/
var TOPICS_XML = 'topics.xml';
/**
* HTTP通信を行う XMLHttpRequestオブジェクト.
*/
var xmlHttpRequest;
/**
* TopicsのXMLを読み込み終わったときのイベントハンドラ.
*/
var _onLoadTopicsXML = function () {};
/**
* Topicsの表示が終わったときのイベントハンドラ.
*/
var _onInsertTopics = function () {};
/**
* Topicsをid="topics"要素の子要素としてXMLのまま表示させる.
*/
this.showNews = function() {
target.xmlHttpRequest = target._createXMLHttpRequest();
if (xmlHttpRequest == null)
return;
// 各イベントハンドラの割り当て
this._onLoadTopicsXML = this._insertTopics;
this._loadTopicsXML();
};
/**
* XMLHttpRequestオブジェクトを作成する.
*
* @return XMLHttpRequest
*/
this._createXMLHttpRequest = function() {
try {
return new XMLHttpRequest();
}
catch (e) {
try {
return new ActiveXObject('Microsoft.XMLHTTP');
}
catch (e) {
return null;
}
}
return null;
};
/**
* TopicsのXMLを読み込みにいく.
*/
this._loadTopicsXML = function() {
target.xmlHttpRequest.onreadystatechange = function() {
if (target.xmlHttpRequest.readyState == 4 &&
/^(200|304)$/.test(target.xmlHttpRequest.status.toString())) {
target._onLoadTopicsXML(target.xmlHttpRequest.responseText);
}
};
target.xmlHttpRequest.open('GET', target.TOPICS_XML, true);
target.xmlHttpRequest.send(null);
};
/**
* HTMLに新着情報をXMLから書き込む.
*/
this._insertTopics = function(topics) {
var topicsDiv = document.getElementById('topics');
topicsDiv.appendChild(document.createTextNode(topics));
};