0

我不明白为什么函数 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”,你可以做两件事:

  1. 您可以使用“触发器处理程序”:

    $('#searchval').triggerHandler('keyup');
    
  2. 您可以使用“呼叫”:

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

当然,在这两种情况下,你都不会得到一个像你在真实事件中得到的那样的“事件”对象,但“foo”无论如何都不关心这一点。

于 2012-07-19T17:58:10.170 回答