0

load event によって呼び出されたときに、関数 foo の「this-reference」が #searchval で設定されていない理由がわかりません。

keyup イベントでの foo の関数呼び出しは機能しますが、この呼び出しは load イベントで機能しません。これは、this-reference が設定されていないためです。

例:

<body>
<form action="" method="post">
<input type="text" name="test" value="<?=$_POST['test']?>" id="searchval">
<select id="names" size="3">
<option value="1">WTF1</option>
<option value="2">WTF2</option>
<option value="3">WTF3</option>
</select>
<input type="submit">
</form>
</body>
<script type="text/javascript">

$(document).ready(function() {
    var names = $('#names option').clone();

    function foo() {
        //Change the code to $('$searchval').val(); make it work
        var val = $(this).val(); 
        $('#names').empty();
        names.filter(function(idx, el) {
            return val === '' || $(el).text().indexOf(val) >= 0;
        }).appendTo('#names');
    }
    $('#searchval').bind('keyup', foo);
    $('#searchval').load(foo());
});
</script>
</html>
4

1 に答える 1

4

関数自体ではなく、「foo」からの戻り値を使用してハンドラーを設定しています。

そのはず:

$('#searchval').load( foo );

を渡すfoo()と、最初に関数を呼び出します—それが何をするか( )です。関数参照だけを渡すことで、必要な効果を得ることができます。

編集—その問題に加えて、コメントに記載されているように、そのようなイベントを決して取得しない要素の「ロード」ハンドラーを設定しようとしています。そのイベントを引き起こすとあなたが期待していることは何ですか?おそらく、「ロード」の代わりに「変更」が必要です。

もう一度編集します—「keyup」イベントが発生したときに「foo」がそのまま呼び出されることをシミュレートしたい場合は、次の2つのことができます。

  1. 「triggerHandler」を使用できます。

    $('#searchval').triggerHandler('keyup');
    
  2. 「呼び出し」を使用できます。

    foo.call($('#searchval')[0]);
    

もちろん、どちらの場合も、実際のイベントで取得するような「イベント」オブジェクトは取得されませんが、「foo」はとにかくそれを気にしません。

于 2012-07-19T17:58:10.170 に答える