jQuery"该参考文献“;加载事件后未设置

jQuery "this-reference" not set after load event

本文关键字:事件 设置 加载 参考文献 quot jQuery      更新时间:2023-12-08

我不明白为什么函数foo中的"this reference"是否未使用#searchval设置,当由load事件调用时?

在keyup事件中对foo的函数调用有效,但在load事件中调用无效,因为未设置此引用。

示例:

<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>

您使用"foo"中的返回值设置处理程序,而不是函数本身。

应该是:

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

传递foo()时,首先调用的是函数—( )就是这么做的。通过只传递函数引用,您可以获得所需的效果。

编辑—最重要的是,正如在一条评论中所指出的,您正试图为一个永远不会得到这样事件的元素设置一个"加载"处理程序。你认为是什么导致了这一事件?也许你想要的是"改变"而不是"加载"。

再次编辑—如果您只想模拟在"keyup"事件发生时按原样调用"foo",您可以做两件事:

  1. 您可以使用"triggerHandler":

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

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

当然,在这两种情况下,你都不会得到一个类似于真实事件的"事件"对象,但"foo"无论如何都不在乎这一点。