JQuery ближайший () вопрос - PullRequest
2 голосов
/ 20 июля 2011

Всем: извините, если я не понял протокол здесь, в StackOverflow. Я немедленно постараюсь исправить свое положение в обществе. Сказав это:

Я пытаюсь изменить контекст функции jQuery в зависимости от того, что ее вызывает. В следующем коде при первой загрузке страницы мы видим, что функция limitDates () вызывается с HTMLElementDiv в качестве текущего контекста. Когда мы вызываем его, набрав в поле ввода, мы видим, что это не div, но попытка получить родительский div с помощью $ (this) .closest ('div') возвращает HTMLElementInput, а не div. Есть мысли?

обновление: создали скрипку: http://jsfiddle.net/earachefl/XBFNQ/8/

<script type="text/javascript" src="common/js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="common/js/jquery-ui-1.8.12.custom.min.js" ></script>

<div class="datemodule">
    <input class="date_from" type="text" id="date_from_#name#" name="date_from" value=#start#>
</div>

<script>
    $(document).ready(function(){
        $('div.datemodule').limitDates();
        $('.date_from').keydown(function(){
            $(this).limitDates();
        });
    });

    (function($){
        $.fn.limitDates = function(){                   
            return this.each(function(){
                context = $(this).context;
                //alert(context);
                alert(context.nodeName);
                if (context.nodeName != 'DIV'){
                    alert('not a div');
                    newContext = $(this).closest('div').context;
                    alert(newContext.nodeName);
                }
            });
        };
    })(jQuery);
</script>

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Контекст - это элемент DOM, который передается в JQuery (). Таким образом, ваши селекторы в первую очередь имеют контекст как документ.

$('div.datemodule').limitDates(); // context is the document
$('.date_from').keydown(...   // context is the document

Когда дело доходит до обратного вызова, если вы используете $ (this), контекст является элементом, который запускает событие.

$('.date_from').keydown(function(){
    $(this).limitDates();         // context is the element which has class .date_form and triggered that event
}); 

И когда дело доходит до вашей функции, в которой вы используете this.each, контекст устанавливается для каждого элемента в каждой итерации.

return this.each(function(){
    $(this).context; // context is the element of iteration
}

Как я уже сказал, контекст - это то, что передается в JQuery, и, вероятно, он доступен только для чтения.

1 голос
/ 20 июля 2011

Описание контекста:

The DOM node context originally passed to jQuery();

Таким образом, даже после вызова closest контекст остается исходным input, переданным jQuery.

Если вы хотите получить div, почему бы просто не получить его?

newContext = $(this).closest('div')[0];
...