とあるシステムを構築中にハマった体験を。
備忘録(javascript)の最近のブログ記事
javascriptで指定した要素の座標を簡単に取得する方法です。
{
var p = {x:0,y:0};
if( !e.offsetParent ){
return p ;
}
else{
}
p.x = e.offsetLeft;
p.y = e.offsetTop;
if(e.offsetParent){
var pp = getElementPosition(e.offsetParent);
p.x += PixNum( pp.x );
p.y += PixNum(pp.y );
}
return p;
}
function PixNum(sz)
{
var s = (sz + "").replace(/\D/g,"");
var n = parseInt(s);
return n;
}
PopBox.js内の
elem.style.zIndex = null
この一行をコメントアウトするといいらしいのだが、
直った!
なんでなんだろう???
javascriptで背景色で分岐して、処理を行うことしようとしていたのですが、IEだと正常に動作してFireFoxだと指定した条件が無視されるという現象が発生。
処理A;
}
else{
処理B;
}
原因は、firefoxだと、RGB形式で色を指定しないとダメでした。
なので、
(row.cells.item(x).style.backgroundColor == "rgb(255, 221, 221)") ){
処理A;
}
とすると正常に動作しました。
javascript のイベントハンドラのまとめたものがほしかったので情報を集めて作成。
《イベントハンドラ一覧》
イベントハンドラ | 発生条件 |
---|---|
onChange | フォーム要素の選択、入力内容が変更された時に発生 |
onSelect | テキストが選択された時に発生 |
onSelectStart | ページ内の要素が選択されようとした時に発生 ※IEのみ |
onSubmit | フォームを送信しようとした時に発生 |
onReset | フォームがリセットされた時に発生 |
onAbort | 画像の読み込みを中断した時に発生 |
onError | 画像の読み込み中にエラーが発生した時に発生 |
onLoad | ページや画像の読み込みが完了した時に発生 |
onUnload | ウィンドウを閉じた時、他のページに切り替えた時、ページをリロード(更新)した時に発生 |
onClick | 要素やリンクをクリックした時に発生 |
onDblClick | 要素をダブルクリックした時に発生 |
onKeyUp | 押していたキーをあげた時に発生 |
onKeyDown | キーを押した時に発生 |
onKeyPress | キーを押してる時に発生 |
onMouseOut | マウスが離れたした時に発生 |
onMouseOver | マウス乗った時に発生 |
onMouseUp | クリックしたマウスを上げた時に発生 |
onMouseDown | マウスでクリックした時に発生 |
onMouseMove | マウスを動かしている時に発生 |
onDragDrop | マウスでドラッグ&ドロップした時に発生 ※NN4のみ |
onBlur | ページやフォーム要素からフォーカスが外れた時に発生 |
onFocus | ページやフォーム要素にフォーカスが当たった時に発生 |
javascriptのgetElementByIdについてですが、
いくら見直しても、スクリプト内で取得した値をフォームのテキストに反映できない。
なぜ?なぜ?
イライラしてきたところで、getElementByIdをよく見直してみると。
値を表示するテキストにIDが指定してない。
初歩的なことでした。
複数のチェックボックスに対して、一括でチェックを入力するチェックボックス
//一括チェックボックス
<input type="checkbox" name="allchk_0" value="1" onclick="allChk0(this.form.allchk_0)" >
//個別チェックボックス
<input type="checkbox" name="check1[1]" value="1" >
<input type="checkbox" name="check1[2]" value="1" >
<input type="checkbox" name="check1[3]" value="1" >
<input type="checkbox" name="check1[4]" value="1" >
<input type="checkbox" name="check1[5]" value="1" >
<input type="checkbox" name="check1[6]" value="1" >
<input type="checkbox" name="check1[7]" value="1" >
<input type="checkbox" name="check1[8]" value="1" >
<input type="checkbox" name="check1[9]" value="1" >
<input type="checkbox" name="check1[10]" value="1" >
<input type="checkbox" name="check1[11]" value="1" >
<input type="checkbox" name="check1[12]" value="1" >
<input type="checkbox" name="check1[13]" value="1" >
<input type="checkbox" name="check1[14]" value="1" >
<input type="checkbox" name="check1[15]" value="1" >
//一括チェック入力script
<script type="text/javascript"><!--
function allChk0( Obj ) {
flg = Obj.checked;
document.form.elements['check1[1]'].checked = flg;
document.form.elements['check1[2]'].checked = flg;
document.form.elements['check1[3]'].checked = flg;
document.form.elements['check1[4]'].checked = flg;
document.form.elements['check1[5]'].checked = flg;
document.form.elements['check1[6]'].checked = flg;
document.form.elements['check1[7]'].checked = flg;
document.form.elements['check1[8]'].checked = flg;
document.form.elements['check1[9]'].checked = flg;
document.form.elements['check1[10]'].checked = flg;
document.form.elements['check1[11]'].checked = flg;
document.form.elements['check1[12]'].checked = flg;
document.form.elements['check1[13]'].checked = flg;
document.form.elements['check1[14]'].checked = flg;
document.form.elements['check1[15]'].checked = flg;
}
// --></script>
PHPと連携して一括チェックボックスを使う。
//配列を定義
$str_arr = array(1=>'aaa',2=>'bbb',3=>'ccc',4='ddd',5=>'eee');
?>
//一括チェックボックス
<input type="checkbox" name="allchk" value="1" onclick="allChk(this.form.allchk)" />
<?php
//個別チェックボックスを配列より生成
foreach($str_arr as $key => $elemet){
if($elemnt){
?>
<input type="checkbox" name="check1[<?=key?>]" value="1" />
<?php
}
}
?>
<script type="text/javascript"><!--
function allChk<?=$index?>( Obj ) {
flg = Obj.checked;
<?php
foreach($str_arr as $key => $element){
if($element){
?>
document.form.elements['check1[<?=$key?>]'].checked = flg; // ON・OFFを切り替え
<?php
}
}
?>
}
// --></script>
なぜかと言うと、入力の時はTEXTAREAタグ内に文字列が表示されるので、何文字・何行あっても枠のサイズは決まっていたのでレイアウトが崩れることはなかったのですが、それを閲覧モードで表示すると文字数・行数によってはレイアウトが大幅に崩れてしまう。
ウィンドウ内の座標をもとに、レイアウトをしているのでTABLE内のレイアウトが崩れると大変なことになるんです。
そこで、TEXTAREAタグの入力制限を設けようと思い四苦八苦。
やっとのことでできました。
とあるPHPで表示したWEBページ内の文字をjavascriptで検索するように設定していて、ある行を境に検索できなくなりました。
ページ内検索のjavascirptは以下のとおり。
var fFirst; //はじめかどうかのフラグ
var objRange; //TextRangeオブジェクト
//検索関数
function Start()
{
objRange = document.body.createTextRange();
//文字列が空であれば終了
if (document.search_form.txtWord.value.length == 0)
{
return;
}
strCheck = document.search_form.txtWord.value;
if (fFirst)
{
fFirst = false;
}
else
{ //2度目以降
objRange.move("character", 1);
}
//セレクトする
if (objRange.findText(strCheck))
{
objRange.select();
objRange.scrollIntoView();
}
}
という感じ。
PHPでWEBページを表示しているんですけど、HTMLタグやらでソースは5万行を超える状態。
この5万行が限界らしく5万目は見事に検索されなくなりました。
49999行目までは検索できるんですけど。
どなたか何か情報もってないですか??
入力フォームを作成していて、どうしてもキーボードのEnterキーを押して間違って送信することがありました。
そこで、Enterキーでの入力で送信をしないようにJavascriptで制御します。
コードは以下のとおりです。
function NoEnter(evt){
evt = (evt) ? evt : event;
var charCode=(evt.charCode) ? evt.charCode :
((evt.which) ? evt.which : evt.keyCode);
if ( Number(charCode) == 13 || Number(charCode) == 3) {
return false;
} else {
return true;
}
}
function NoSendEnter(formName) {
var elements = document.forms[formName].elements;
for (var j=0; j < elements.length; j++) {
var e = elements[j];
if (e.type == "text"){
e.onkeypress=NoEnter;
}
}
}
実際のフォームには次のように埋め込みます。
<form name="form1">
~入力項目~
<input type="text" name="text1">
</form>
<script>
NoSendEnter('form1');
</script>