備忘録(javascript)の最近のブログ記事

とあるシステムを構築中にハマった体験を。


javascript内でPHPをパラメタ付きで呼び出すのですが、Firefoxでは正常に動作するも、IE9では正常に動作しない。
パラメタには日本語を含めていました。
なぜ???
いろいろと調べた結果、文字コードの問題でした。
HTML,PHP,javascript全てUTF−8で記述しているのですが、パラメタを渡すとSJISとして渡ってしまう。
うーん、metaタグとかscriptタグにcharset="UTF-8"を付加してるのになぜ。

結局、javascript内で以下のような記述をすることでIE、Firefoxともに同じ動作をするようになりました。
var Str = encodeURIComponent(文字列);

原因がわかるのに、苦労しました(--;)

javascriptで指定した要素の座標を簡単に取得する方法です。


function getElementPosition(e)
{
    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だと指定した条件が無視されるという現象が発生。


if(row.cells.item(x).style.backgroundColor == "#ffdddd"){
    処理A;
}
else{
    処理B;
}

原因は、firefoxだと、RGB形式で色を指定しないとダメでした。


なので、


if( (row.cells.item(x).style.backgroundColor == "#ffdddd") ||
(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と連携して一括チェックボックスを使う。
<?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>

とあるWEBアプリを構築していたのですが、TABLE内に配置したTEXTAREAがネックになっていました。
なぜかと言うと、入力の時は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>

カスタム検索

ioPLAZA【アイ・オー・データ直販サイト】 ioPLAZA【アイ・オー・データ直販サイト】
あれもこれも標準装備のレンタルサーバ あれもこれも標準装備のレンタルサーバ


Web広告限定ストア(eクーポン)Web広告限定ストア(eクーポン)

問い合わせ

メールフォーム