5

私はこれについて多くの投稿を読みましたが、確かな答えはありません。これが私のコードです:

// button creation
onew = document.createElement('input');
onew.setAttribute("type", "button");
onew.setAttribute("value", "hosts");
onew.onclick = function(){fnDisplay_Computers("'" + alines[i] + "'"); }; // ie
onew.setAttribute("onclick", "fnDisplay_Computers('" + alines[i] + "')"); // mozilla
odiv.appendChild(onew);

現在、setAttribute()メソッド(mozillaコメント付き)はmozillaで正常に機能しますが、それがその上の行の後に来る場合に限ります。つまり、最後に設定された方がデフォルトになっているように見えます。.onclickメソッド(ieコメント付き)はどちらの場合も機能しません、私はそれを間違って使用していますか?

いずれにせよ、IEでこれを機能させる方法を見つけることはできません。両方で言うまでもありません。.onclickメソッドを使用するときに関数呼び出しを変更しましたが、アラート関数を呼び出すだけで正常に機能しました。そのため、構文が正しくないと思います。

簡単に言えば、IE/Mozilla間でonclickパラメータを一貫して機能させることができません。

-ニコラス

4

4 に答える 4

15

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))
            );
        };
    };
}
于 2009-04-14T20:32:24.550 に答える
6

私は通常、次のようなものを使用します。

onew.onclick = new Function("fnDisplay_Computers('" + alines[i] + "')");

これは IE と Firefox の両方で動作するはずです。

于 2009-04-14T19:18:52.170 に答える
1

Mozilla ベースのブラウザーの引数として " " を使用してaddEventListener()関数を使用し、 IEの引数として" " を使用して関数を使用します。たとえば、次のように、try/catch ステートメントを使用するのが最適です。clicktypeattachEvent()onclicksEvent

try {
  onew.attachEvent("onclick", //For IE
                   function(){fnDisplay_Computers("'" + alines[i] + "'"); });
}
catch(e) {
  onew.addEventListener("click", //For Mozilla-based browsers
                   function(){fnDisplay_Computers("'" + alines[i] + "'"); },
                   false);
}
于 2009-04-14T19:17:48.863 に答える
0

#3は抗議しすぎると思います。多くの状況で、私は動的にテーブルを作成していて、コールバック関数にパラメーターを渡す必要があります。私の変数parmは問題のテーブル行への整数インデックスであるため、これはタイプセーフな問題ではありません。クロスブラウザに準拠しているように見える可変パラメータと固定パラメータの両方を含むコードは次のとおりです。

for (i = 0; i < arrTableData.length; i++) {
    eleTR = objTable.insertRow(i + 1);
    cell = eleTR.insertCell(0);
    cell.width = "21";
    var myElement = document.createElement('img');
    myElement.setAttribute('src', 'images/button_down.gif');
    myElement.setAttribute('alt', 'Move item down');
    myElement.onclick = new Function('moveItem(' + i + ',0)');
    cell.appendChild(myElement);
}
于 2010-04-24T16:21:45.493 に答える