onew.setAttribute("タイプ", "ボタン");
HTML ドキュメントでは setAttribute を使用しないでください。IE は多くの場合、これを大きく間違えますが、DOM-HTML プロパティは短く、速く、読みやすくなっています。
onew.type= 'button';
onew.onclick = function(){fnDisplay_Computers("'" + alines[i] + "'"); }; // すなわち
「アリエス」とは?なぜ文字列に変換して一重引用符で囲むのですか? 文字列内のコードを評価することを含む凶悪なことをしようとしているようです (これは、以下の「onew.setAttribute」バージョンで行っていることです)。文字列内の JavaScript コードを評価することは、ほとんどの場合間違っています。ペストのようにそれを避けてください。上記の場合、IE は Firefox と同じように動作するはずです: 動作しないはずです。
「alines[i]」が文字列の場合、JavaScript で元の文字列に評価されるコード文字列を作成して、その文字列を記憶させようとしていると思います。しかし:
"'" + alines[i] + "'"
では不十分です。'alines[i]' にアポストロフィまたはバックスラッシュがあるとどうなりますか?
'O'Reilly'
構文エラーとセキュリティ ホールの可能性があります。今、あなたは面倒で面倒なことをすることができます:
"'" + alines[i].split('\\').join('\\\\').split("'").join("\\'") + "'"
文字列をエスケープしようとしますが、それは見苦しく、他のデータ型では機能しません。JavaScript に依頼することもできます。
uneval(alines[i])
しかし、すべてのオブジェクトを評価可能な JavaScript ソース文字列に変換できるわけではありません。基本的に、アプローチ全体は失敗する運命にあります。
onclick コールバックでパラメータを指定して関数を呼び出したいだけの場合、通常行うべきことは、単純な方法でコードを記述することです。
onew.onclick= function() {
fnDisplay_Computers(alines[i]);
};
通常、これは機能し、必要なものです。ただし、ここでヒットした可能性のあるわずかなしわがあります。これが、弦の奇抜なアプローチを考えるように混乱させている可能性があります。
つまり、この場合の 'i' が囲んでいる 'for' ループの変数である場合、'alines[i]' への参照は、あなたが思っていることを実行しません。「i」は、クリックが発生したときにコールバック関数によってアクセスされます — これはループが終了した後です。この時点で、変数 'i' にはループの最後にあった値がそのまま残るため、どの 'onew' がクリックされたかに関係なく、'alines[i]' は常に 'alines' の最後の要素になります。
(例えば、ActionScript 3 (AS3)でクロージャーの問題を修正する方法を参照してください)
次のように、クロージャーを独自の関数にカプセル化することで、ループの問題を回避できます。
function callbackWithArgs(f, args) {
return function() { f.apply(window, args); }
}
// ...
onew.onclick= callbackWithArgs(fnDisplay_Computers, [alines[i]]);
また、JavaScript の新しいバージョンでは、次のように簡単に言うことができます。
onew.onclick= fnDisplay_Computers.bind(window, alines[i]);
今日のブラウザで「Function.bind()」を使用できるようにしたい場合は、Prototypeフレームワークから実装を取得するか、次を使用できます。
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner,
args.length===0? arguments : arguments.length===0? args :
args.concat(Array.prototype.slice.call(arguments, 0))
);
};
};
}