1

だから、私はJS初心者であることを認めますが、私が知る限り、これは機能するはずですが、そうではありません.

バックグラウンド:

3 つのリスト ボックスを含むフォームがあります。リスト ボックスの名前は、app1、db1、および db2 です。私はJavaScriptを使用して、ユーザーが追加のリストボックスを追加できるようにし、追加の選択ボックスごとに名前タグを増やしています。

ボックスという名前のアプリを追加すると、追加フィールドごとに値が適切に増加します。selects という名前の追加のデータベースを追加しようとすると、配列の最初のループで 2 番目のタグを認識できません。これにより、db2 という名前の 2 つの要素ができてしまいます。後続の各タグでは、適切に認識され、適切にインクリメントされます。

db1 タグの HTML は次のとおりです。

<select name="db1">
  *options*
</select>

そしてdb2:

<select name="db2">
  *options*
</select>

タグは同一です。シーケンス内の次の番号を把握するために使用している関数を次に示します (注: タグは app または db のいずれかであり、tags は DOM 内のすべての選択タグ名の配列です。タグを検査すると、次のようになります['app1', 'db1', 'db2', '']):

function return_select_name(tag, tags) {
  matches = new Array();
  var re = new RegExp(tag + "\\d+", "g");
  for (var i = 0; i < tags.length; i++) {
    var found = re.exec(tags[i]);
    if (found != null) {
      matches.push(found[0]);
    }
  }
  matches = matches.sort();
  index = parseInt(/\d+/.exec(matches.last())) + 1;
  index = tag + index;
  return index;
}

app タグを追加すると、「app2」が返されます。db タグを検索すると、最初は「db2」、2 回目は db3 などを返します。

基本的に、私はここで何か間違ったことをしていると確信しています。

4

3 に答える 3

2

名前を生成するために使用するdb用のカウンターとapp用のカウンターを保持することで処理します。

var appCounter = 1;//set this manually or initialize to 0 and
var dbCounter = 2;//use your create function to add your elements on pageload

次に、次のタグを作成するときに、カウンターをインクリメントして、名前のサフィックスとして使用します。

var newAppElement = document.createElement('select');
newAppElement.name = 'app' + (++appCounter);
..

//  --OR for the db element--

var newDbElement = document.createElement('select');
newDbElement.name = 'db' + (++dbCounter );
..
于 2012-06-04T13:23:58.877 に答える
1

あなたが得ている問題は、正規表現オブジェクトがステートフルであることです。正規表現の作成をループ内に配置することで、プログラムを修正できます。

function return_select_name(tag, tags) {
  matches = new Array();
  // <-- regex was here
  for (var i = 0; i < tags.length; i++) {
    var re = new RegExp(tag + "\\d+", "g"); //<--- now is here
    var found = re.exec(tags[i]);
    if (found != null) {
      matches.push(found[0]);
    }
  }
  matches = matches.sort();
  index = parseInt(/\d+/.exec(matches[matches.length-1])) + 1; //<--- I dont think matches.last is portable, btw
  index = tag + index;
  return index;
}

いずれにせよ、これを自分で行う場合は、複雑なテキスト マッチングを避け、次のタグ インデックスを変数またはハッシュ マップに格納することをお勧めします。


別の提案: 正規表現に括弧を入れる場合:

// /tag(\d+)/
var re = new RegExp(tag + "(\\d+)", "g");

その後found[1]、後で追加の手順を実行せずに、番号を直接取得するために使用できます。

于 2012-06-04T13:40:24.430 に答える
0

これはすでに回答されていることは知っていますが、これを概念実証としてまとめました。

http://jsfiddle.net/zero21xxx/LzyTf/

これはオブジェクトなので、おそらくさまざまなシナリオで再利用できます。もちろん、改善できる方法はありますが、クールだと思ったので共有したいと思います。

console.debugChrome と FF でのみ動作します。

于 2012-06-04T13:58:17.307 に答える