4

私はすでにこれを見てきましたが、これはある意味で役に立ちました。

ここに問題があります。ユーザークリックを介して要素に伝播されたユーザーのリストがあります。このようなもの:

<div id="box">
    joe-user
    page-joe-user
    someone-else
    page-someone-else
</div>

クリック時に、ユーザーがまだdivをクリックしていないことを確認したいと思います。だから、私は次のようなことをしています:

if ( ! $('#box').html().match(rcpt) )
{
   update_div();
}
else
{
   alert(rcpt+' already exists.');
}

ただし、javascriptが正規表現に対して持っている補間の既存の欠如により、page-joe-userが選択された後、ユーザーが選択したユースケースでアラートがトリガーされますjoe-user。これは明らかにまったく同じではありません。

Perlでは次のようなことをします:

if ( $rcpt =~ /^\Qrcpt\E/ )
{
    # code
}

私がやりたいのは、match()を次のように変更することだけです。

if ( ! $('#box').html().match(/^rcpt/) )
{
    # code
}

if ( ! $('#box').html().match(rcpt) )少し有望に見えましたが、それも失敗します。関数IE内の複雑なRE構文の連結を使用してnew RegExp()も、使用は機能しません$('#box').html().match(new RegExp('^'+rcpt))。私も試し$('#box').html().match('/^'+rcpt'/')ました。私は何かが欠けていると想像することしかできません。私はjavascriptにかなり慣れていません。

このサイトでは、このようなユースケースに実際に対応するものを見つけることができないようです。

TIA

4

1 に答える 1

3

このmatch関数は、jQuery オブジェクトではなく、文字列に対してのみ機能します。

これを行う最善の方法は、各ユーザー名を個別の HTML タグに入れることです。

例えば:

<ul id="users">
    <li>joe-user</li>
    <li>page-joe-user</li>
    <li>someone-else</li>
    <li>page-someone-else</li>
</ul>

次に、次のように記述できます。

if($('#users li').is(function () { return $(this).text() === rcpt; }))

自分のやり方でやりたい場合は、 を呼び出しtext()て要素内の文字列を取得する必要があります。( $('#box').text().match(...))


EDIT : HTML を使用してこれを行う最善の方法は、文字列を分割することです。

例えば:

var userExists = false;
var users = $('#box').text().split(/\r?\n/);

for(var i = 0; i < users.length; i++) {   //IE doesn't have indexOf
    if (users[i] == rcpt) {
        userExists = true;
        break;
    }
}
if (userExists) {
    //Do something
}

これには、正規表現インジェクションに対して脆弱ではないという追加の利点があります。

于 2009-12-24T01:37:45.047 に答える